浅谈布隆过滤器在内容管理系统中的应用
- 格式:doc
- 大小:20.51 KB
- 文档页数:9
基于布隆过滤器的海量数据查询技术的优化与应用随着信息技术、数据库和数据仓库技术等的飞速发展,每时每刻都会有海量的数据产生,对于这些数据的采集、清洗、存储、查询等一系列问题得到了越来越多学者和公司的重视,由此一些数据处理系统,如海量数据查询系统也就产生出来。
在这个系统中,查找就是确定一个具有特定值的元素是不是一个特定集合的成员。
分布式环境下,随着数据量的增加,为保证系统性能,元素的表示、查找方法常常需要从空间存储、查找效率及准确性等方面来进行考虑。
本文基于一个用户行为数据分析的案例,搭建海量用户行为数据查询系统来进行分析与说明。
首先对海量数据查询系统进行了需求分析,为获得清晰的数据血缘关系、减少重复开发,从理论上对系统数据仓库进行了分层,
对每一层的特点及功能进行了分析,针对每一层的数据流向,设计并
实现了原始数据接入模块、原始数据提取模块、付费用户筛选模块等。
在整个系统之中,对输入的原始数据进行了采集清洗存储后,在筛选
与付费用户筛选模块中,需要在海量数据中判断某账号是否属于付费用户的数据集,布隆过滤器算法提供了一种快速、有效的实现方法。
首先简述了直接使用Hive来级联查询的方案,其操作简洁,但解析HiveQL,调用MapReduce程序的过程耗时较长,然后提出使用MongoDB 内存数据库存储付费用户的解决方案,其搜索效率很高;如果使用分
布式缓存的方法,把付费用户通过合适的数据结构读入内存,这时需
要一对一存取,将不同的数据结构HashSet与布隆过滤器算法的时间复杂度、空间复杂度进行了对比,通过分析及实验知,布隆过滤器占用
少量的存储开销、查找时间复杂度为常数,解决本类问题极为合适,针对其可能产生的错误数据(“假阳性”)提出消除方案,并进行了实验验证。
详解布隆过滤器的原理、使用场景和注意事项英文版Detailed Explanation of Bloom Filter's Principles, Usage Scenarios, and PrecautionsBloom Filter is a space-efficient probabilistic data structure that is used to test whether an element is a member of a set. It was invented by Burton Bloom in 1970 and has found widespread applications in various fields such as caching, network security, and databases.Principles of Bloom Filter:Bloom Filter works by using bit arrays and hash functions. Here's a step-by-step explanation of its principles:Initialization: Bloom Filter starts with an empty bit array of size 'm' bits, initially set to zero.Hashing: Bloom Filter uses 'k' independent hash functions, each mapping the input elements to one of the 'm' bit positions in the bit array.Insertion: When inserting an element into the Bloom Filter, each hash function is applied to the element, and the corresponding bit positions in the bit array are set to 1.Testing: To test whether an element is a member of the set, the same hash functions are applied to the element, and if all the corresponding bit positions in the bit array are 1, then the element is considered to be a member of the set. However, it's important to note that a false positive result (i.e., falsely claiming that an element is a member) is possible, but a false negative (i.e., falsely claiming that an element is not a member) is not possible.Usage Scenarios of Bloom Filter:Bloom Filters are widely used in various scenarios due to their space efficiency and probabilistic nature. Some common usage scenarios include:Caching: Bloom Filters can be used to quickly determine whether a requested item is present in a cache, thus avoiding unnecessary disk I/O operations.Network Security: Bloom Filters are used in network security applications to quickly detect the presence of malicious content in network packets.Databases: Bloom Filters can be used in databases to efficiently search for the presence of specific keys in a large dataset.Precautions When Using Bloom Filter:When using Bloom Filter, it's important to consider the following precautions:False Positives: As mentioned earlier, Bloom Filters can produce false positive results. Therefore, it's crucial to have a fallback mechanism to confirm the membership of elements that are identified as positive by the Bloom Filter.Choosing the Right Parameters: The performance of Bloom Filter depends on the choice of parameters such as the size of the bit array 'm' and the number of hash functions 'k'. It's important to choose these parameters carefully based on the specific requirements of the application.Dynamic Updates: Bloom Filters are typically designed for static sets, and updating them dynamically (e.g., adding or removing elements) can be challenging. If dynamic updates are required, it's advisable to consider alternative data structures or modify the Bloom Filter accordingly.In summary, Bloom Filter is a powerful probabilistic data structure that offers efficient membership testing with space efficiency. However, it's crucial to understand its principles, limitations, and precautions to ensure its effective usage in various scenarios.中文版详解布隆过滤器的原理、使用场景和注意事项布隆过滤器是一种空间效率高的概率性数据结构,用于测试一个元素是否属于某个集合。
布隆过滤器应用场景
布隆过滤器是一种计算技术,可以有效地判断某个元素是否在大量数据中出现过。
布隆过滤器可以用来快速处理各种类型的大规模数据,其实现比构建索引高效得多,因此,它已成为处理大数据的重要工具,并且在多个应用场景中得到了广泛的应用。
首先,布隆过滤器可以用于数据库应用。
由于数据库需要处理大量的数据,如果使用传统的索引结构,就会造成内存和性能瓶颈,因此布隆过滤器可以在数据库中快速检测数据,可以有效减少查询时间,提高数据库的查询性能。
其次,布隆过滤器也可以用于网络安全领域。
布隆过滤器可以用于把大量的IP地址存储在一个表里,在检测攻击者的IP地址时,只需要对布隆过滤器进行查询,就可以很快得到结果,从而有效地防范攻击行为,而不需要耗费过多的资源。
另外,布隆过滤器还可以用于大数据挖掘和机器学习应用中。
布隆过滤器可以被用于分析大量数据,它可以帮助提高筛选出特定数据的准确度,从而提高挖掘数据的效率;同时,布隆过滤器也可以用于机器学习系统中,用于记忆数据,从而简化机器学习系统的计算。
此外,布隆过滤器还可以用于实时推荐系统。
当用户发布内容或者点击某个页面时,布隆过滤器可以实时判断用户的点击记录,从而实时推荐相关内容给用户,帮助用户更有效地浏览网页,评论内容等。
最后,布隆过滤器还可以用于搜索引擎优化应用中。
当用户输入关键字进行搜索时,布隆过滤器可以帮助搜索引擎快速定位搜索过程
中出现过的词语,从而快速完成搜索,提高用户体验。
总之,布隆过滤器作为具有快速查询特性的计算技术,已经在数据库、网络安全、大数据挖掘、机器学习、实时推荐以及搜索引擎优化等应用中得到了广泛的使用,它对大数据处理及数据库性能优化有着十分重要的作用。
位与布隆过滤器内存高效存储大规模数据的方法在当今大数据时代,存储和查询海量数据成为了一项重要的技术挑战。
传统的数据库管理系统往往需要庞大的内存和磁盘空间来存储和处理这些数据,而且查询速度也会受到限制。
为了解决这个问题,研究人员提出了许多高效存储大规模数据的方法,其中一种重要的方法就是使用位与布隆过滤器(Bitwise Bloom Filter)。
布隆过滤器是一种用于判断一个元素是否存在于一个集合中的概率型数据结构。
它通过使用一组位数组和一系列哈希函数来实现这一功能。
当一个元素加入到布隆过滤器中时,通过将元素经过多个哈希函数的计算得到多个位的索引,并将这些位设置为1。
当查询一个元素是否存在于布隆过滤器中时,同样将该元素经过哈希函数的计算得到多个位的索引,并检查对应的位是否都为1。
如果有任何一位为0,则可以确定该元素一定不存在于布隆过滤器中;如果所有位都为1,则可能存在,需要进一步验证。
然而,一般的布隆过滤器在存储大规模数据时会占用大量的内存空间。
为了解决这个问题,研究人员提出了许多方法来减少布隆过滤器的内存占用。
首先,可以使用较短的位数组来表示布隆过滤器,但会增加误判率。
这是因为当位数组较短时,不同元素的哈希函数计算得到的位索引可能会重复,导致误判。
为了降低误判率,可以增加哈希函数的数量,但也会增加计算的开销。
因此,在平衡内存占用和误判率之间需要进行权衡,根据具体需求选择适当的位数组长度和哈希函数数量。
其次,可以采用多层级的布隆过滤器来存储数据。
这种方法将数据按照某种规则划分为多个子集,并针对每个子集构建一个独立的布隆过滤器。
查询时首先判断元素属于哪个子集,然后在对应的子集布隆过滤器中进行查询。
这种方法可以减少每个布隆过滤器的位数组长度,从而降低内存占用。
另外,可以通过压缩位数组来减少内存占用。
传统的布隆过滤器使用一个位来表示一个元素是否存在于集合中,而压缩布隆过滤器则将多个位编码为一个字节或更长的数据块。
布隆过滤器的原理和应用布隆过滤器是一种高效的数据结构,用于检索一个元素是否存在于一个大型集合中。
它具有快速查询速度和低存储需求的特点,广泛应用于各种大规模数据处理场景中。
本文将介绍布隆过滤器的原理和应用。
一、原理布隆过滤器基于一系列的哈希函数和位数组实现快速的元素查询。
其核心思想是,当一个元素被加入集合时,通过多个哈希函数将该元素映射到一个位数组的多个位置上,将这些位置的值设置为1。
当判断一个元素是否存在于集合时,将该元素进行相同的哈希函数映射,并检查对应位置上的值是否都为1。
若有任意一个位置的值为0,则可以确定该元素不存在于集合中,否则可能存在于集合中。
布隆过滤器的哈希函数通常采用 MurmurHash、FNV 等快速哈希算法,可以保证哈希值的均匀分布。
位数组中的每个位置只需要占用一个比特位,因此可以在节省存储空间的同时实现大规模数据的快速检索。
二、应用布隆过滤器广泛应用于各种实际场景中,以下是几个常见的应用示例:1. 大规模数据去重在大规模数据处理中,数据去重是一个常见的问题。
使用布隆过滤器可以快速判断一个元素是否已存在于已有数据集合中,从而去除重复数据,提高数据处理效率。
2. 防止缓存穿透在缓存系统中,如果缓存中不存在某个请求的结果,而数据库中也不存在该结果,那么该请求会直接穿透缓存直接访问数据库,导致数据库压力过大。
使用布隆过滤器可以在缓存层判断该结果是否存在于数据库中,减轻数据库的负载。
3. 防止恶意请求布隆过滤器可以用于恶意请求的过滤,例如防止恶意爬虫大量请求网站接口,或者阻断某种类型的网络攻击。
通过将恶意请求的特征信息加入布隆过滤器,可以在前置的高效过滤器层阻止恶意请求,减少服务器的压力。
4. URL过滤在网络爬虫等应用中,需要对URL进行过滤,防止重复抓取和进入黑名单网站。
使用布隆过滤器可以快速判断一个URL是否已经被访问过,从而避免重复请求。
5. 拼写检查布隆过滤器可以用于拼写检查和自动纠错。
布隆过滤器实现原理及应用场景布隆过滤器是一种在大规模数据集中进行快速查找的数据结构。
它的主要应用场景是在判断一个元素是否存在于集合中时,非常高效。
在本篇文章中,我将详细介绍布隆过滤器的实现原理以及应用场景。
一、实现原理布隆过滤器的实现基于一个位数组和多个哈希函数。
位数组通常由一系列二进制位组成,初始时都被设置为0。
而哈希函数则用于将输入的元素映射到位数组中的不同位上。
1. 插入过程:当需要向布隆过滤器中插入一个元素时,首先将该元素经过多个哈希函数进行哈希计算,得到一系列哈希值。
然后将位数组中对应位置的二进制位设为1,表示该位置上存在一个元素。
2. 查询过程:当需要判断一个元素是否存在于布隆过滤器中时,将该元素经过同样的哈希函数计算,得到一系列哈希值。
然后检查位数组中对应位置的二进制位是否都为1,如果有任何一个位置的二进制位为0,表示该元素一定不存在于布隆过滤器中;如果所有位置的二进制位都为1,表示该元素可能存在于布隆过滤器中(注意:可能是因为存在哈希冲突)。
需要特别注意的是,布隆过滤器有一定的误判率。
即使所有位置的二进制位都为1,表示元素可能存在于布隆过滤器中,但并不一定准确。
因此,在实际应用中,布隆过滤器常常与其他数据结构(如哈希表)一起使用,用于缩小误判率。
二、应用场景布隆过滤器具有快速查找、占用内存较小等优势,因此在以下场景中被广泛应用。
1. 网络爬虫中的URL去重在网页爬取过程中,经常需要判断一个URL是否已经被爬取过。
传统的方法是使用哈希表来存储已爬取的URL,但是当爬取的数据量非常大时,哈希表的存储空间将会非常庞大。
而布隆过滤器可以以较小的内存空间满足去重需求,大大提高了爬取效率。
2. 垃圾邮件过滤在邮件服务器中,需要对每封新到达的邮件进行是否为垃圾邮件的判断。
使用布隆过滤器可以快速判断邮件的发件人、主题等信息是否属于已知的垃圾邮件特征,从而将判定为垃圾邮件的邮件快速过滤掉,提高了邮件处理效率。
布隆过滤器的原理和应用场景布隆过滤器的概述布隆过滤器是一种空间效率非常高的概率型数据结构,用于判断一个元素是否在一个集合中。
它由布隆过滤器的位数组和哈希函数组成,可以高效地判断一个元素是否存在于集合中,但有一定的误判率。
布隆过滤器的原理布隆过滤器的主要原理是利用位数组和多个哈希函数来表示一个集合,并判断一个元素是否存在于集合中。
1.初始化:将位数组初始化为全0。
2.添加元素:对于要添加的元素,使用多个哈希函数计算出多个哈希值,然后将对应的位数组位置设为1。
3.判断元素:对于要判断的元素,同样使用多个哈希函数计算出多个哈希值,然后检查对应的位数组位置是否都是1。
若有任意一个位数组位置为0,则判定元素不存在于集合中;若全部位数组位置都为1,则判定元素可能存在于集合中。
布隆过滤器的优点布隆过滤器具有以下优点: - 空间效率高:布隆过滤器只需要占用很少的内存空间,比其他数据结构如散列表等要小得多。
- 查询效率高:布隆过滤器只需要进行位操作和哈希计算,所以查询效率非常高。
- 可并行处理:布隆过滤器的查询和插入操作可以并行处理,因为它们对位数组的操作没有依赖关系。
布隆过滤器的应用场景布隆过滤器在以下场景中具有较大的应用价值:1.网络爬虫中的URL去重:爬虫在抓取网页时,通常需要判断一个URL是否已经抓取过,布隆过滤器可以非常高效地进行URL去重。
2.邮件服务器中的垃圾邮件过滤:布隆过滤器可以帮助邮件服务器快速判断一封邮件是否是垃圾邮件,从而提高邮件过滤的效率。
3.分布式系统中的缓存穿透控制:布隆过滤器可以用于控制分布式系统中的缓存穿透问题,减轻数据库压力。
4.数据库查询缓存:布隆过滤器可以用于缓存数据库的部分查询结果,提高数据库查询效率。
布隆过滤器的误判率布隆过滤器的误判率是根据哈希函数的数量和位数组的大小决定的。
误判率主要取决于以下两个因素: - 哈希函数的数量:哈希函数越多,误判率越低,但算法的效率也会降低。
布隆过滤器应用场景布隆过滤器是一种高效的数据结构,它的基本原理是,对于一个特定集合中的每一个元素,不但存储其本身,而且还存储其一定数量的一致哈希值,以便快速确定该元素是否存在于特定的集合中。
它可以被用来快速检索一组元素,可以有效地检测一个元素是否存在于集合中,而无需访问实际的集合。
由于其精准的识别能力,布隆过滤器得到了广泛的应用。
1.业应用:在网络安全相关的商业应用领域,布隆过滤器被用来检测恶意代码的僵尸网络,分析不断变化的市场数据,过滤垃圾邮件等。
例如,可以使用布隆过滤器来快速检测恶意请求,从而有效地降低网络安全风险。
2.物信息学应用:布隆过滤器可以被用来快速查找DNA测序数据中的基因序列。
此外,当它还可以应用于其他生物学和遗传学领域如蛋白质组学,转录组学和基因组学等。
3.数据应用:布隆过滤器可以有效地检测网站中的指定元素,比如URL中的关键字,用户搜索的关键字等。
它可以帮助企业进行非结构化大数据分析,找出其中的趋势,帮助公司更好地投资和发展。
4.器学习应用:机器学习领域中,布隆过滤器可以用来快速处理海量数据,它可以比其他技术更快地提取出特征,从而有效地提升模型的性能。
布隆过滤器的技术优势可以用来有效地完成许多实际问题,它已被广泛应用于商业,生物信息学,大数据和机器学习等多个领域,其中许多(如恶意代码和垃圾邮件的检测)都需要高效、准确的分类和识别。
该技术也有助于提高网络安全和快速定位对象,从而减少对企业的不利影响。
布隆过滤器在上述应用领域中主要由两个基本部件组成:一个抽象数据结构,用于存储一组特征值,另一个则是一个算法,可以计算出更多更具特征性的哈希值,用于判断一个元素是否已存在于某一特定的集合中。
此外,布隆过滤器还支持动态添加新元素,并有很高的查询效率。
因此,布隆过滤器具有非常广泛的应用场景,它可以快速检索大量数据,准确识别特定元素,高效确定元素是否存在于集合中,并有助于提高网络安全性。
它被广泛应用于商业,生物信息学,大数据,机器学习等领域,有助于企业实现良好的效率和安全,获得更大的发展优势。
数据管理与储存实现数据去重的最佳方法随着大数据时代的到来,数据的管理和储存成为了重要的任务。
其中一个重要的任务就是数据去重,即对重复出现的数据进行删除或合并,以减少存储空间的占用和提高数据查询的效率。
本文将介绍几种实现数据去重的最佳方法,并分析其优缺点。
一、哈希算法哈希算法是一种常见的实现数据去重的方法。
该方法通过将数据转化为一个对应的哈希值,然后将哈希值与已有的哈希值进行比较,若存在相同的哈希值,则判定为重复数据。
常见的哈希算法有MD5、SHA-1等。
优点:1. 哈希算法具有快速计算的特点,适合处理大规模的数据集。
2. 哈希算法对数据进行摘要计算,可以有效地降低存储空间的占用。
缺点:1. 哈希算法存在一定的冲突概率,即不同的数据可能计算出相同的哈希值,从而导致误判。
2. 哈希算法无法还原原始数据信息,只能判断是否重复,这在一些应用场景下可能不符合需求。
二、排序算法排序算法是另一种常见的实现数据去重的方法。
该方法通过对数据进行排序,然后判断相邻的数据是否相同,若相同则判定为重复数据。
优点:1. 排序算法可以确保相同的数据在排序后被连续存放,方便判断是否重复。
2. 排序算法可以通过二分查找等高效的方式进行数据查询,提高查询效率。
缺点:1. 排序算法需要消耗额外的计算和存储资源,适合处理规模较小的数据集。
2. 排序算法对于数据的插入和删除操作效率较低,不适合频繁变动的数据集。
三、布隆过滤器布隆过滤器是一种空间效率非常高的数据结构,它通过利用位数组和多个哈希函数实现对数据的去重判断。
具体而言,布隆过滤器将数据映射到位数组上的多个位置,如果这些位置都为1,则判定为重复数据。
优点:1. 布隆过滤器具有空间效率高的优点,适合处理大规模的数据集。
2. 布隆过滤器的查询速度非常快,且不受数据规模的影响。
缺点:1. 布隆过滤器存在一定的误判率,即可能将不重复的数据误判为重复,但误判率可以通过合理设置哈希函数数量和位数组大小进行控制。
浅谈布隆过滤器在内容管理系统中的应用摘要:内容管理系统的内容采集主要由爬虫进行搜集,但内容重复与否绝大多数情况下是根据内容所在的页面URI进行判定。
作为一个完善的内容管理系统,必须具备对已有内容资源的识别功能。
本文通过介绍布隆过滤器,并与传统的判重方式进行对比,同时改进布隆过滤器并应用于内容管理系统的资源判重的功能中,解决了内存占用无限增加,查询时间不断增长,记录内容无法删除等问题,实现了高效快速的资源判重。
关键词:计算机工程;布隆过滤器;内容管理系统;爬虫;哈希中图分类号:TP399文献标识码:ADOI:10.3969/j.issn.1003-6970.2016.01.0080 引言Web信息的采集通常是利用网络爬虫等工具遍历万维网,它把万维网看作一个以网页为节点,网页间链接为边的超大规模有向图,然后利用图的遍历算法对万维网进行遍历。
在网络遍历的过程中.需要判断待采集的页面是否已经采集过了,这就需要把已经采集的网页地址记录下来,组成已采集网页地址集合(记为:visited-set),当新的采集开始之前,首先判断其地址是否在visited-set中,如在其中,表示网页已经采集,否则采集网页,把网页地址放在visited-set中,从而避免网页的重复采集,浪费资源。
为了实现集合中数据的快速查找,需要把URL映射为集合中的地址,这就需要设计一种高效且冲突率低的散列算法;同时由于万维网上网页数据的巨大,普通的Hash算法已经不能满足空间的要求,所以更需要一种节约空间的算法。
本文运用Bloom Filter设计了一种节省空间的大规模数据表示和查找方式,应用到内容管理系统中,以应对海量信息采集中判重的需求,文中分析了布隆过滤器相对于HashMap的优越之处,同时指出布隆过滤器的使用条件和弱点,并针对本系统的自身特点和需求,提出了一种针对过滤器的改进方案并予以实现,运用到该系统中。
1 布隆过滤器1.1 概念布隆过滤器是一种空间和时间效率很高的随机访问型数据结构,它利用位数组表示一个集合,并能判断一个元素是否属于这个集合。
Bloom Filter看似简洁,但这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。
因此,BloomFilter不适合那些“零错误”的应用场合。
而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省,同时摒弃了冲突导致的一系列冲突处理。
1.2 集合表示和元素查询初始状态时,Bloom Filter是一个包含m位的位数组,每一位都置为0。
为了表达S={xl,x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。
对任意一个元素X,第i个哈希函数映射的位置hi (x)就会被置为1(1≤i≤k)。
注意,如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。
在图2中,k=3,且有两个哈希函数选中同一个位置(从左边数第五位)。
在判断v是否属于这个集合时,我们对v应用k次哈希函数,如果所有hi (y)的位置都是1(1≤i≤k),那么我们就认为y是集合中的元素,否则就认为y不是集合中的元素。
图3中y1就不是集合中的元素。
y2或者属于这个集合,或者刚好是一个false positive。
2 布隆过滤器在内容管理系统中的使用内容管理系统由若干部分构成,其功能主要可以分为三大部分:来源、存储和展示。
其中,布隆过滤器主要应用在来源部分中的去重。
作为内容管理系统,来源主要有两个方面:爬虫和手动上传。
对于绝大多数的数据搜集,都是通过爬虫的自动化爬取获得的。
因此,在不经过人为的干涉的情况下,如何能够有效地抓取不同的内容,防止重复内容对空间和时间的浪费,才是过滤过程的关键所在。
因此,为了能让过滤器有的放矢,首先需要明确爬虫的工作机理。
下面对爬虫的工作机制做一个简单的介绍。
2.1 爬虫工作流程简单来说,爬虫可以归结为一个生产者和消费者的问题。
在爬取内容时经历了从“发现”到“爬取”的过程。
“发现”,即为对目标链接的获取,目标来自于初始链接和内容中存在的链接。
一旦发现目标链接之后,就要将其放入待爬取的队列中去,等待“爬取”功能的调用。
那么,为了能够快速的判断哪些链接需要访问,哪些已经爬取过,最简单的办法就是,将已经访问过的链接(url)放入集合,在每次将新的链接放入队列之前,首先与集合中的历史信息相比对,若没有,则放入队列,否则丢弃。
因此,历史信息的比对模块就应该放在生产者到队列之间,提供过滤作用。
最通用的方式即为HashMap进行历史信息的存储,但针对HashMap的不足之处,本文使用了BloomFilter进行了替换,下面针对HashMap的不足进行了说明。
2.2 HashMap如图5所示,HashMap的主体是由Entry[]构成的,该数组中的每一个Entry节点都由Key和Value组成。
HashMap通过key.hashcode计算所在entry对应在数组中的下标位置,如果遇到冲突,则以链表的形式储存在链尾。
因此,hashMap首先需要存储对象本身和它的key,其使用场景更趋向于,通过key去获取对象本身,而不仅仅是判断该对象是否存在,这样就会在仅仅需要判断对象是否存在的使用场景下造成极大的浪费,原因如下:对象本身所需要的空间并不固定,有的对象很大,有的仅仅是基本类型,因此,该空间无法预估。
hashmap 本身为了达到快速查找,在0(1)的时间复杂度获取对象的目的,随着对象的加入,需要不断的扩容,这同时造成了时间和空间上的开销,使得”增加历史资源”的性能降低。
为了降低哈希的冲突率,hashmap本身会在资源总量的基础上多预留一部分空间,从而造成浪费。
综合以上HashMap的不足之处,结合“过滤及判重”功能的需求,布隆过滤器的优势非常突出:1.不需要存储对象本身,只需要知道该对象是否存在。
2.可以在0 (l)时间复杂度内完成对对象存在性的判定。
3.在预估存储目标的数量级后,可基本确定空间大小,不需动态调整。
但是,布隆过滤器也没有做到十全十美,它依靠了错误率和冗余空间换取了高速度的查询,相比于HashMap,加入了“错误率”这一概念,替换了“冲突”。
下面分析BloomFilter 的错误率情况,及所需位数组大小的判定条件。
2.3 错误率估计Bloom Filter在判断一个元素是否属于它表示的集合时会有一定的错误率(false positive rate),不妨设:m为bit数组长度,n为集合元素个数,k为hash函数的个数和p为误判概率。
假设kn<m且各个哈希函数是完全随机的。
当集合S={xl,x2,…,xn}的所有元素都被k个哈希函数映射到m位的位数组中时,这个位数组中某一位还是0的概率是:P’=(1-1/m)^kn.其中1/m表示任意一个哈希函数选中这一位的概率(前提是哈希函数是完全随机的),(1-1/m)表示哈希一次没有选中这一位的概率。
要把S完全映射到位数组中,需要做kn 次哈希。
某一位还是0意味着kn次哈希都没有选中它,因此这个概率就是(l-l/m)的kn次方。
现在查询一个不在集合中的元素,当它所对应的k个位置都为1时会发生误判,这个概率p是:((1-1/m)^kn)^k.既然Bloom Filter要靠多个哈希函数将集合映射到位数组中,如果哈希函数的个数多,那么在对一个不属于集合的元素进行查询时得到0的概率就大;但另一方面,如果哈希函数的个数少,那么位数组中的0就多。
为了得到最优的哈希函数个数,在给定m和n的情况下,当k取以下值时,误判率p 的值最小:k=(m/n)In2-0.7(m/n)此时误判率p等于:Pmin=(1-1/2)^k=0.6185^(m/n)。
换句话说,要想保持错误率低,最好让位数组有一半还空着。
2.4 位数组的大小在不超过一定错误率的情况下,设Bloom Filter至少需要m位才能表示全集中任意n个元素的集合。
假设全集中共有u个元素,允许的最大错误率为e,下面我们来求位数组的位数m。
假设X为全集中任取n个元素的集合,F(X)是表示X 的位数组。
那么对于集合X中任意一个元素x,在s=F(X)中查询x都能得到肯定的结果,即s能够接受x。
显然,由于Bloom Filter引入了错误,s能够接受的不仅仅是X中的元素,它还能够e(u-n)个误判(false positive)。
因此,对于一个确定的位数组来说,它能够接受总共n+e(u-n)个元素。
在n+e(u-n)个元素中,s真正表示的只有其中n个,所以一个确定的位数组可以表示n+e(u-n)/n个集合。
m位的位数组共有2m个不同的组合,进而可以推出,m位的位数组可以表示2^m(n+e(u-n)/n)个集合。
全集中n个元素的集合总共有(u!)/(n!*(u_n)!),因此要让m位的位数组能够表示所有n个元素的集合,必须有(2^m)(n+e(u-n)/n)>(u!)/(n!*(u-n)!).综上所述,我们得出结论:在错误率不大于e的情况下,m至少要等于n log2 (1/e)才能表示任意n个元素的集合。
上文中计算出,当k= In2- (m/n)时错误率f最小,这时f=(1/2)k=(1/2)mln2/n。
现在令f≤e,可以推出n 《log2(1/e))/ln2)=nlog2elog2 (l/e)≤m这个结果比之前计算的下界n log2 (l/e)大了log2(e)≈1.44倍。
这说明在哈希函数的个数取到最优时,要让错误率不超过e,m至少需要取到最小值的1.44倍。
3 布隆过滤器的工程改进和实现上面所述,布隆过滤器引入了错误率这一项,传统的过滤器还有一个最大的缺陷,即:无法删除已有的记录。
由于原生的布隆过滤器所引用的数组是bit数组(这也是它体积小的最大优势),因此,当hash散列之后,对应位只有0和1的区别。
最终,即便多个对象被某个散列函数定位到同一个下标,值也只能标记为1,而不能累计。
在这一点上,如果使用integer数据类型对比bit数据类型,则可以做到累计的效果,因此具备删除的可行性,但是势必会使得整个数组的体积增大,integer为32位,则整个数组将至少膨胀为原来的32倍。
单从这一点上对过滤器的优化不是很困难,只要存储够用即可。
为了适用于内容管理系统,为系统增加删除资源的功能,因此过滤器选择优化方案即为将bit替换为integer类型。
在替换前,根据上述公式,取n为1000000个页面链接,£为0.01错误率,算得的最小空间是0.88M,不妨取IM(工程中采用1M),而替换后过滤器的总大小为32M,但很好的在原有误判率的基础上解决了删除的问题。