布隆过滤器
redisson布隆过滤器原理

redisson布隆过滤器原理Redisson布隆过滤器是一种基于Redis的高性能、高可靠性的布隆过滤器实现,主要用于判断一个元素是否存在于一个大集合中。
布隆过滤器是一种概率型数据结构,它利用多个哈希函数和一个二进制位数组来判断一个元素是否存在于集合中。
当有一个元素要加入到集合中时,通过多个哈希函数将元素映射到二进制位数组中的多个位置,将这些位置的二进制位设为1、当判断一个元素是否存在时,通过多个哈希函数将元素映射到二进制位数组中的多个位置,如果这些位置的二进制位都为1,则说明元素可能存在于集合中;如果有任何一个位置的二进制位为0,则说明元素一定不存在于集合中。
Redisson布隆过滤器的原理如下:1. 创建布隆过滤器:使用Redisson创建布隆过滤器实例时,会在Redis服务器上创建一个字符串类型的键,用于存储布隆过滤器的二进制位数组。
同时,还会创建一个Redis的BitSet数据结构,用于在内存中表示二进制位数组。
2. 添加元素:当有一个元素要添加到布隆过滤器中时,首先会经过多个哈希函数的映射,将元素映射到二进制位数组中的多个位置。
然后,通过Redis的BitSet数据结构将这些位置的二进制位设置为13. 判断元素是否存在:当判断一个元素是否存在于布隆过滤器中时,同样需要通过多个哈希函数的映射,将元素映射到二进制位数组中的多个位置。
然后,通过Redis的BitSet数据结构判断这些位置的二进制位是否为1,如果有任何一个位置的二进制位为0,则说明元素一定不存在于布隆过滤器中;如果这些位置的二进制位都为1,则说明元素可能存在于布隆过滤器中。
4. 删除元素:由于布隆过滤器无法删除元素,因此Redisson布隆过滤器也无法删除元素。
如果需要删除元素,只能重置整个布隆过滤器。
5.误判率控制:由于布隆过滤器是概率型数据结构,存在一定的误判率。
误判率主要受两个因素影响:布隆过滤器的容量和哈希函数的数量。
布隆过滤器的时间复杂度

布隆过滤器的时间复杂度布隆过滤器(Bloom Filter)是一种快速判断某个元素是否存在于大规模数据集中的数据结构,它通过位数组和不同的哈希函数实现。
由于其高效的查询性能和低内存占用,被广泛应用于网络缓存、关键词过滤、数据重复性判断等领域。
本文将详细介绍布隆过滤器的时间复杂度。
1. 布隆过滤器的原理和特点布隆过滤器通过将每个元素经过多个哈希函数得到的哈希值在位数组中对应的位置标记为1,来表示元素的存在。
当查询某个元素是否存在时,同样对该元素进行多次哈希函数计算,并检查对应的位数组位置是否都为1。
如果存在任意一个位置不为1,则可以确定该元素不存在于数据集中。
布隆过滤器的特点包括:- 快速查询:布隆过滤器的查询时间只与哈希函数的个数有关,与数据集大小无关,具有常量级的查询时间复杂度。
- 低内存占用:布隆过滤器只需要开辟一个位数组空间,并通过哈希函数计算得到的位置进行标记,不存储实际数据,因此占用的内存空间相对较小。
- 可能的误判:布隆过滤器判断元素是否存在时,可能会出现误判的情况。
当位数组中的某个位置被其他元素的哈希值所标记时,查询元素的哈希值可能也会被认为存在,但实际上该元素并不存在。
2. 插入元素的时间复杂度插入元素到布隆过滤器中的时间复杂度主要取决于哈希函数的个数和哈希值计算的效率。
假设布隆过滤器的位数组长度为m,哈希函数的个数为k,要插入的元素个数为n。
每个元素的哈希函数计算次数为k,因此插入n个元素的总哈希函数计算次数为nk。
对于每个元素的哈希值,在位数组中标记位置为1的时间复杂度是O(1)。
因此,插入元素的总时间复杂度可以表示为:O(nk)需要注意的是,为了保证布隆过滤器的效果,位数组的长度和哈希函数的个数需要合理选择。
位数组的长度过小容易导致误判率升高,而哈希函数的个数过多则会增加计算的时间开销。
3. 查询元素的时间复杂度查询元素是否存在于布隆过滤器中的时间复杂度也主要取决于哈希函数的个数和哈希值计算的效率。
布隆过滤器底层原理

布隆过滤器底层原理布隆过滤器是一种数据结构,用于快速判断一个元素是否存在于一个集合中。
它通过使用位数组和多个哈希函数来实现这一功能。
布隆过滤器的底层原理非常巧妙,可以高效地处理大规模的数据集。
布隆过滤器的核心是位数组,它通常是一个固定长度的二进制数组。
位数组的每个位置都对应一个位,初始时都被设置为0。
当一个元素被加入到布隆过滤器中时,它会经过多个哈希函数的处理,得到多个哈希值。
这些哈希值对应的位置在位数组中被设置为1。
当需要判断一个元素是否存在时,同样会经过多个哈希函数的处理,得到多个哈希值。
如果这些哈希值对应的位置都为1,那么可以判断该元素可能存在于集合中。
如果有任何一个位置为0,那么可以确定该元素一定不存在于集合中。
布隆过滤器的核心思想是通过多个哈希函数的处理,将元素分散到位数组中的不同位置。
这样可以减少冲突的概率,提高判断的准确性。
同时,布隆过滤器的空间效率也非常高。
由于位数组的长度是固定的,不受存入元素的个数影响,所以在存储大规模数据集时,布隆过滤器所占用的空间相对较小。
然而,由于布隆过滤器的特殊性,它也存在一些缺点。
首先,布隆过滤器在判断一个元素是否存在时,有一定的误判率。
也就是说,有可能判断一个元素存在于集合中,但实际上并不存在。
这是因为多个元素可能被哈希到同一个位置上,导致冲突。
其次,布隆过滤器只能判断元素是否存在,而不能得到元素的具体信息。
因此,在实际应用中,布隆过滤器通常用于判断一个元素是否存在,如果需要获取具体信息,还需要进一步查询其他数据结构。
布隆过滤器在实际应用中有着广泛的应用。
例如,它可以用于网络爬虫中,判断一个URL是否已经被访问过,从而避免重复爬取。
又如,在大规模的分布式系统中,布隆过滤器可以用于判断一个元素是否已经存在于缓存中,从而减少对数据库的查询次数。
此外,布隆过滤器还可以用于垃圾邮件过滤、黑名单检测等方面。
总的来说,布隆过滤器是一种高效、节省空间的数据结构,用于判断一个元素是否存在于一个集合中。
redisson布隆过滤器原理

redisson布隆过滤器原理Redisson布隆过滤器原理一、背景介绍布隆过滤器是一种高效的数据结构,用于判断一个元素是否存在于集合中。
它通过使用多个哈希函数将元素映射到一个大的二进制位数组中,并将对应位置的值设为1,表示该元素存在于集合中。
当需要判断一个元素是否存在时,只需要将该元素经过相同的哈希函数映射到位数组中,并检查对应位置的值是否为1即可。
Redisson是一个基于Redis实现的Java分布式对象框架,提供了丰富的数据结构和分布式服务。
其中之一就是布隆过滤器。
二、Redisson布隆过滤器特点1. 高效性:Redisson布隆过滤器可以在常数时间内判断一个元素是否存在于集合中,而不需要遍历整个集合。
2. 空间效率高:Redisson布隆过滤器只需要占用很小的空间就可以存储大量数据。
3. 可扩展性强:Redisson布隆过滤器支持动态扩容和缩容,可以根据实际需求灵活调整大小。
三、Redisson布隆过滤器实现原理1. 哈希函数选择在使用布隆过滤器时,需要选择多个哈希函数将元素映射到位数组中。
Redisson布隆过滤器默认使用了MurmurHash算法和JenkinsHash 算法,这两种算法都具有良好的散列性能和低碰撞率。
2. 位数组大小计算在创建Redisson布隆过滤器时,需要指定期望容量和误判率。
根据这两个参数,可以计算出需要的位数组大小和哈希函数个数。
其中,位数组大小的计算公式为:m = (n * ln(p)) / ln(2)^2其中,m表示位数组大小,n表示期望容量,p表示误判率。
3. 元素添加当向Redisson布隆过滤器中添加一个元素时,会将该元素经过多个哈希函数映射到位数组中,并将对应位置的值设为1。
如果该位置已经被设为1,则不需要再次设置。
4. 元素判断当需要判断一个元素是否存在于Redisson布隆过滤器中时,会将该元素经过相同的哈希函数映射到位数组中,并检查对应位置的值是否为1。
详解布隆过滤器的原理、使用场景和注意事项

详解布隆过滤器的原理、使用场景和注意事项英文版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.中文版详解布隆过滤器的原理、使用场景和注意事项布隆过滤器是一种空间效率高的概率性数据结构,用于测试一个元素是否属于某个集合。
布隆过滤器 课程设计

布隆过滤器课程设计
布隆过滤器是一种空间效率高的数据结构,通常用于快速检索一个元素是否属于一个集合中。
在进行布隆过滤器的课程设计时,需要考虑以下几个方面:
1. 布隆过滤器的原理:首先,需要深入理解布隆过滤器的原理,包括如何进行元素的插入和查询,以及误判率的计算方法。
布隆过滤器的实现依赖于位数组和多个哈希函数,通过位数组和哈希函数的组合,可以实现高效的元素检索。
2. 数据结构设计:在设计布隆过滤器的课程项目时,需要考虑如何设计数据结构来存储位数组和哈希函数。
位数组的大小需要根据预期的元素数量和误判率进行合理的选择,而哈希函数的选择也会影响到布隆过滤器的性能。
3. 实现算法:在实现布隆过滤器的算法时,需要考虑如何高效地插入和查询元素。
可以采用现成的哈希函数库,也可以自己实现哈希函数来提高性能。
此外,需要考虑如何处理哈希冲突,以及如何优化位数组的内存使用。
4. 性能优化:在设计布隆过滤器的课程项目时,可以考虑如何优化布隆过滤器的性能。
例如,可以通过调整位数组的大小和哈希函数的选择来减少误判率,也可以通过并行化的方式来加速元素的插入和查询过程。
5. 应用场景:最后,可以考虑如何将布隆过滤器应用到实际的场景中。
布隆过滤器常用于网络爬虫的URL去重、缓存的数据查询等场景,可以通过设计相关的应用案例来加深对布隆过滤器的理解。
通过以上几个方面的考虑,可以设计出一个完整的布隆过滤器的课程项目,帮助学生深入理解布隆过滤器的原理和实现方式,提高他们的数据结构和算法的实践能力。
同时,也可以通过布隆过滤器的课程设计,帮助学生将理论知识应用到实际的项目中,提高他们的解决问题的能力。
布隆过滤器快速判断元素是否存在的数据结构

布隆过滤器快速判断元素是否存在的数据结构布隆过滤器(Bloom Filter)是一种快速判断元素是否存在的数据结构,它通过位数组和一系列哈希函数来实现这一目标。
布隆过滤器在大规模数据集中判断元素的存在性能优于传统的查找算法,且具有较低的空间复杂度。
一、布隆过滤器的基本原理布隆过滤器的基本原理包括初始化、插入元素和判断元素存在性三个步骤。
1. 初始化:布隆过滤器使用一个位数组(bit array)为基础数据结构,同时包含多个哈希函数。
位数组的长度通常为m位,初始时全部初始化为0。
2. 插入元素:当需要将一个元素加入到布隆过滤器中时,首先使用哈希函数对元素进行计算,将其映射到位数组中的多个位置上,并将这些位置的值设置为1。
3. 判断元素存在性:当需要判断一个元素是否存在于布隆过滤器中时,同样使用哈希函数对该元素进行计算,然后在位数组中查找对应的位置的值。
若所有位置上的值都为1,则元素可能存在于布隆过滤器中;若存在任一位置的值为0,则元素一定不存在于布隆过滤器中。
二、布隆过滤器的应用场景布隆过滤器适用于需要快速判断元素存在性,但对判断结果的精确性要求不高的场景。
它主要应用于大规模数据的快速查找、缓存击穿和垃圾邮件过滤等领域。
1. 大规模数据的快速查找:在海量数据集中,通过布隆过滤器可以快速判断某个元素是否存在,从而避免了昂贵的磁盘或数据库查询操作。
在搜索引擎、数据库等场景中,布隆过滤器可以用来过滤掉一部分明显不存在的数据,从而提高查询效率。
2. 缓存击穿的防范:当缓存中不存在某个元素时,为了防止大量请求同时查询数据库,可以使用布隆过滤器来判断元素是否一定不存在于缓存中。
如果布隆过滤器判断元素不存在,则可以提前返回给用户“数据不存在”的结果。
3. 垃圾邮件过滤:在垃圾邮件过滤中,布隆过滤器可以用来存储垃圾邮件的特征,比如发件人、邮件主题等信息。
当新的邮件到达时,通过布隆过滤器可以快速判断该邮件是否为垃圾邮件,从而进行相应的处理。
布隆过滤器公式

布隆过滤器公式全文共四篇示例,供读者参考第一篇示例:【布隆过滤器公式】在计算机科学领域,布隆过滤器是一种用于快速判断一个元素是否属于某个集合的概率型数据结构。
它由一个位数组和多个哈希函数组成,利用哈希函数将元素映射到位数组中的位置,并在判断元素是否存在时执行多次哈希计算。
布隆过滤器不支持删除操作,且存在一定的误判率。
布隆过滤器的实现依赖于两个核心要素:位数组和哈希函数。
位数组用于存储元素的映射结果,每个位置都对应一个二进制位。
哈希函数负责将元素映射到位数组中的位置,通常会选择多个不同的哈希函数,以增加映射的随机性和减小误判率。
布隆过滤器的判断过程包括插入和查询两个操作。
在插入操作中,将元素经过哈希计算后的位置置为1;在查询操作中,执行相同的哈希计算,检查位数组中对应位置的值是否为1,若全部为1则判断元素存在于集合中,若存在0则判断元素不存在于集合中。
布隆过滤器的一个重要应用场景是网络爬虫的网址去重。
在网络爬虫中,需要避免重复地访问同一网址,而布隆过滤器能够高效地对已访问过的网址进行去重,提高爬取效率。
布隆过滤器还被广泛应用于一致性哈希、缓存击穿和拦截恶意IP等领域。
现在,我们来看一下布隆过滤器的核心公式。
布隆过滤器的位数组大小m和哈希函数个数k是两个关键参数,它们将直接影响到过滤器的容错率和性能。
下面是布隆过滤器位数组大小m和哈希函数个数k 的计算公式:假设有n个元素需要存储到布隆过滤器中,希望达到指定的容错率(误判率)p,那么可以通过以下公式计算位数组大小m和哈希函数个数k:m = - (n * ln(p)) / (ln(2)^2)k = (m / n) * ln(2)ln表示自然对数,^表示幂运算。
以上两个公式可以通过实际情况进行调整,以满足具体的需求。
在选择位数组大小和哈希函数个数时,需要权衡容错率、内存消耗和性能等因素,以获得最合适的布隆过滤器配置。
布隆过滤器的公式是布隆过滤器设计和实现中的关键指导,通过合理选择位数组大小和哈希函数个数,可以提高过滤器的效率和准确性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
布隆过滤器
布隆过滤器(Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。
在垃圾邮件过滤的黑白名单方法、爬虫(Crawler)的网址判重模块中等等经常被用到。
哈希表也能用于判断元素是否在集合中,但是布隆过滤器只需要哈希表的1/8或1/4的空间复杂度就能完成同样的问题。
布隆过滤器可以插入元素,
但不可以删除已有元素。
其中的元素越多,false positive rate(误报率)越大,但是false negative (漏报)是不可能的。
一. 算法描述
一个empty bloom filter是一个有m bits的bit array,每一个bit位都初始化为0。
并且定义有k个不同的hash function,每个都以uniform random distribution将元素hash到m个不同位置中的一个。
在下面的介绍中n为元素数,m为布隆过滤器或哈希表的slot数,k为布隆过滤器重hash function数。
为了add一个元素,用k个hash function将它hash得到bloom filter中k个bit位,将这k个bit位置1。
为了query一个元素,即判断它是否在集合中,用k个hash function将它hash得到k个bit位。
若这k bits全为1,则此元素在集合中;若其中任一位不为1,则此元素比不在集合中(因为如果在,则在add时已经把对应的k个bits位置为1)。
不允许remove元素,因为那样的话会把相应的k个bits位置为0,而其中很有可能有其他元素对应的位。
因此remove会引入false negative,这是绝对不被允许的。
当k很大时,设计k个独立的hash function是不现实并且困难的。
对于一个输出范围很大的hash function(例如MD5产生的128 bits数),如果不同bit位的相关性很小,则可把此输出分割为k份。
或者可将k个不同的初始值(例如0,1,2, … ,k-1)结合元素,feed给一个hash function从而产生k个不同的数。
当add的元素过多时,即n/m过大时(n是元素数,m是bloom filter的bits数),会导致false positive过高,此时就需要重新组建filter,但这种情况相对少见。
二. 时间和空间上的优势
当可以承受一些误报时,布隆过滤器比其它表示集合的数据结构有着很大的空间优势。
例如self-balance BST, tries, hash table 或者array, chain,它们中大多数至少都要存储元素本身,对于小整数需要少量的bits,对于字符串则需要任意多的bits(tries是个例外,因为对于有相同prefixes的元素可以共享存储空间);而chain结构还需要为存储指针付出额外的代价。
对于一个有1%误报率和一个最优k值的布隆过滤器来说,无论元素的类型及大小,每个元素只需要9.6 bits来存储。
这个优点一部分继承自array 的紧凑性,一部分来源于它的概率性。
如果你认为1%的误报率太高,那么对每个元素每增加4.8 bits,我们就可将误报率降低为原来的1/10。
add和query的时间复杂度都为O(k),与集合中元素的多少无关,这是其他数据结构都不能完成的。
如果可能元素范围不是很大,并且大多数都在集合中,则使用确定性的bit array远远胜过使用布隆过滤器。
因为bit array对于每个可能的元素空间上只需要1 bit,add和query的时间复杂度只有O(1)。
注意到这样一个哈希表(bit array)只有在忽略collision 并且只存储元素是否在其中的二进制信息时,才会获得空间和时间上的优势,而在此情况下,它就有效地称为了k=1的布隆过滤器。
而当考虑到collision时,对于有m个slot的bit array或者其他哈希表(即k=1的布隆过滤器),如果想要保证1%的误判率,则这个bit array只能存储m/100个元素,因而有大量的空间被浪费,同时也会使得空间复杂度急剧上升,这显然不是space efficient的。
解决的方法很简单,使用k>1的布隆过滤器,即k个hash function将每个元素改为对应于k个bits,因为误判度会降低很多,并且如果参数k和m选取得好,一半的m可被置为为1,这充分说明了布隆过滤器的space efficient性。
三. 举例说明
以垃圾邮件过滤中黑白名单为例:现有1亿个email的黑名单,每个都拥有8 bytes的指纹信息,则可能的元素范围
为,对于bit array来说是根本不可能的范围,而且元素的数量(即email列表)为,相比于元素范围过于稀疏,而且还没有考虑到哈希表中的collision问题。
若采用哈希表,由于大多数采用open addressing来解决collision,而此时的search时间复杂度为:
即若哈希表半满(n/m = 1/2),则每次search需要probe 2次,因此在保证效率的情况下哈希表的存储效率最好不超过50%。
此时每个元素占8 bytes,总空间为:
若采用Perfect hashing(这里可以采用Perfect hashing是因为主要操作是search/query,而并不是add和remove),虽然保证worst-case也只有一次probe,但是空间利用率更低,一般情况下为50%,worst-case时有不到一半的概率为25%。
若采用布隆过滤器,取k=8。
因为n为1亿,所以总共需要被置位为1,又因为在保证误判率低且k和m选取合适时,空间利用率为50%(后面会解释),所以总空间为:
所需空间比上述哈希结构小得多,并且误判率在万分之一以下。
四. 误判概率的证明和计算
假设布隆过滤器中的hash function满足simple uniform hashing假设:每个元素都等概率地hash到m个slot中的任何一个,与其它元素被hash到哪个slot无关。
若m为bit数,则对某一特定bit位在一个元素由某特定hash function插入时没有被置位为1的概率为:
则k个hash function中没有一个对其置位的概率为:
如果插入了n个元素,但都未将其置位的概率为:
则此位被置位的概率为:
现在考虑query阶段,若对应某个待query元素的k bits全部置位为1,则可判定其在集合中。
因此将某元素误判的概率为:
由于,并且当m很大时趋近于0,所以
从上式中可以看出,当m增大或n减小时,都会使得误判率减小,这也符合直觉。
现在计算对于给定的m和n,k为何值时可以使得误判率最低。
设误判率为k的函数为:
设,则简化为
,两边取对数
, 两边对k求导
下面求最值
因此,即当时误判率最低,此时误判率为:
可以看出若要使得误判率≤1/2,则:
这说明了若想保持某固定误判率不变,布隆过滤器的bit数m与被add的元素数n应该是线性同步增加的。
五. 设计和应用布隆过滤器的方法
应用时首先要先由用户决定要add的元素数n和希望的误差率P。
这也是一个设计完整的布隆过滤器需要用户输入的仅有的两个参数,之后的所有参数将由系统计算,并由此建立布隆过滤器。
系统首先要计算需要的内存大小m bits:
再由m,n得到hash function的个数:
至此系统所需的参数已经备齐,接下来add n个元素至布隆过滤器中,再进行query。
根据公式,当k最优时:
因此可验证当P=1%时,存储每个元素需要9.6 bits:
而每当想将误判率降低为原来的1/10,则存储每个元素需要增加4.8 bits:
这里需要特别注意的是,9.6 bits/element不仅包含了被置为1的k位,还把包含了没有被置为1的一些位数。
此时的
才是每个元素对应的为1的bit位数。
从而使得P(error)最小时,我们注意到:
中的,即
此概率为某bit位在插入n个元素后未被置位的概率。
因此,想保持错误率低,布隆过滤器的空间使用率需为50%。