布隆过滤器会出现误判的情况,但不会有漏解发生(即宁可错杀三千,绝不放过一个)。
什么是布隆过滤器?
- 声明一个长度为m的位类型的数组记为bitMap,即数组中的每一个位置只占一个bit,每个bit只有0和1两种状态。
- 然后存在k个哈希函数,输出域的范围设为S≥m。(如果一个优秀的哈希函数能够将很多不同的输入值哈希之后得到的返回值非常均匀的分布在S上,那么将所有的返回值对m取余,可以认为所有的返回值也会均匀的分布在0~m-1上)
- 对同一个输入对象(假设是一个字符串)经过k个哈希函数算出来的k个结果之间可能相同,也可能不同,但彼此独立。对算出来的每一个结果对m取余,然后在位数组上将相应的位置置为1。
- 接下来对每一个输入对象做相同的处理,当所有对象处理完毕之后,bitMap数组中已经有相当多的位置被置为1。至此,一个布隆过滤器生成完毕。
- 该过滤器不支持删除一个已经插入的对象,因为该对象对应的位会牵动到其他的位。所以一个简单的改进就是 counting Bloom filter,用一个counter数组代替位数组,就可以支持删除了。
那么如何利用布隆过滤器检测是否存在查询对象呢?
- 如果该查询对象在布隆过滤器中存在,那么经过k个哈希函数映射取余之后,对应的bitMap数组的相应位置上肯定为1。如果k个位置中存在一个位置不为1,那么该查询对象肯定不在布隆过滤器中;如果都为1,我们认为该查询对象在布隆过滤器中,但可能会存在误判。
- 之所以出现误判的原因是因为在生成布隆过滤器的阶段,如果输入对象过多,而BbitMap过小,则会导致bitMap的大多数位置被置为1(即类似于哈希冲突的情况),这就有可能误认为查询对象出现在布隆过滤器中。
- 所以会根据输入对象的个数n和允许出现的失误率p来确定布隆过滤器的大小m和哈希函数的个数k
- m= -(n*lnp)/(ln2)2
- k=ln2*(m/n)
- 所以最终得出真实的失误率为(1-e-nk/m)k
一个布隆过滤器代表一个集合,可以判断一个元素是否在集合中。优势在于可以使用很少的空间达到较高的准确率。
布隆过滤器适于解决限定存储空间,允许一定失误率的问题。
问题:
- 不安全网页的黑名单包含100亿个黑名单网页,每个网页的URL最多占用64B。现在想要实现一个网页过滤系统,利用该系统可以根据网页的URL判断该网页是否在黑名单上,请设计该系统。
- 该系统允许有万分之一以下的判断失误率
- 使用的额外空间不要超过30GB
分析:
- 如果把黑名单中的所有URL全部保存到哈希表中,每个URL60B,数量100亿,那么至少需要640GB空间,不符合题目要求。
- 利用布隆过滤器解决。
- n=100亿,p=0.01%,得出m约为20*n,即需要2000亿个bit即25GB,k=14即哈希函数个数为14,有了m和k计算出真实失误率为0.006%
本文介绍了布隆过滤器,它会误判但不漏解,通过位类型数组和多个哈希函数生成。不支持删除,改进的counting Bloom filter可支持。还说明了利用其检测对象是否存在的方法及误判原因,给出确定大小和哈希函数个数的公式。最后用其设计网页过滤系统,满足空间和失误率要求。
167万+

被折叠的 条评论
为什么被折叠?



