1.原理:
a.解决的问题:
判断一个元素是否在一个集合中
b.Hash表的特点:
i.快速准确,但是耗费存储空间
ii.先将url或者email转为8个字节的信息指纹,在考虑Hash50%的存储效率,1亿url或者email需要16亿字节,即1.6GB空间
c.布隆过滤器:
i.能用1/8到1/4大小的空间就能解决问题,主要用一个很长的二进制向量和一系列随机映射函数
i.能用1/8到1/4大小的空间就能解决问题,主要用一个很长的二进制向量和一系列随机映射函数
ii.对1亿的email地址,先申请16亿字节空间,作为一个二进制向量,然后将其全部清0,对一个地址X,用8个随机数产生器(F1,...,F8)生成8个信息指纹(f1,...,f8),再用一个随机数产生器G把这8个信息指纹映射到1-16亿中的8个自然数g1,...,g8,再把这8个自然数对应位置设置为1,构成布隆过滤器
![](https://i-blog.csdnimg.cn/blog_migrate/72eda5568c4bba2d70c00749204c80fd.png)
iii.布隆过滤器绝对不会漏掉在黑名单中的email,但是有时会出现误判,将正确的email判断为黑名单,一种处理办法是建立一个小的白名单,储存那些可能被误判的邮件地址
2.布隆过滤器的误识别率:
a.假阳性:把不在集合中的元素错判成集合中的元素
b.假设布隆过滤器有m比特,里面有n个元素,每个元素对应k个指纹的Hash函数,求一个位置在插入n个元素后被置成1的概率(因为置成1有很多种可能,考虑置成0方便简单)
i.某个比特被置为1的概率为1/m,为0的概率为1-1/m
ii.插入一个元素后,其为0的概率为(1-1/m)^k,插入n个元素后,为0的概率为(1-1/m)^kn;则插入n个元素后为1的概率为1-(1-1/m)^kn
iii.当新的元素被误判时,需要其k个Hash函数的信息指纹都为1,即(1-(1-1/m)^kn)^k,约为(1-e^kn/m)^k,
![](https://i-blog.csdnimg.cn/blog_migrate/523fde77d14f7eb9e8409ee45eb8b8f6.png)