布隆过滤器

布隆过滤器(Bloom Filter)是1970年由Burton Howard Bloom提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

布隆过滤器用来过滤垃圾邮件,一个方法就是记录下那些发送垃圾邮件的E-mail地址。但是那些发送者不停地在注册新的地址,将他们都存起来则需要大量的网络服务器。如果用哈希表,每存储一亿个E-mail地址,就需要1.6GB的内存,所以存储几十亿个邮件地址可能需要上百GB的内存,一般服务器是无法存储的。所以引出了布隆过滤器....

假定存储一亿个电子邮件地址,先建立一个16亿二进制常量,即两亿字节的向量,然后将这16亿个二进制位全部设置为零。对于每一个电子邮件地址X,用8个不同的随机数产生器(F1,F2,F3,F4,F5,F6,F7,F8)产生8个信息指纹(f1,f2,f3,f4,f5,f6,f7,f8)。再用一个随机数产生器G把这8个信息指纹映射到1到16亿中的8个自然数g1,g2,g3,g4,g5,g6,g7,g8。现在我们把这8个位置的二进制位全部设置为1。当我们对这一亿个E-mail地址都进行这样的处理后,一个针对这些E-mail地址的布隆过滤器就建成了。

如果Y在黑名单中,显然,g1,g2,g3,g4,g5,g6,g7,g8对应的8个二进制位一定是1.这样在遇到任何黑名单中的电子邮件地址时,我们都能够准确的发现。

有一点不足的需要进行特判。布隆过滤器有极小的可能性将一个不在黑名单中的电子邮件地址判定为在黑名单中,因为有可能某个好的邮件地址正巧对应8个都被设置为1的二进制位。由于这个可能性极小,我们称他为误视概率。一上面的例子为例,误视概率大概在万分之一以下。常见的解决方法是建立另外一个小的白名单,存储那些可能误判的邮件地址。


隆过滤器的优劣主要与哈希函数的质量相关,而且哈希函数之间的相关度越小越好,每个哈希函数本身的计算过程不要太复杂,不然会影响效率。理想情况下是取k个完全不相关的哈希函数,在不是很严格情况下,也可以通过一个哈希函数的参数变化产生k个不同的哈希函数,比如将i1ik)作为参数参与哈希函数的计算。

初始状态时,Bloom Filter是一个包含m位的位数组,每一位都置为0。


 

为了表达S={X1, X2,…,Xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素X,第i个哈希函数映射的位置Hi(X)就会被置为1(1≤i≤k)。注意,如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。在下图中,k=3,且有两个哈希函数选中同一个位置(从左边数第五位)。  

 


 


在判断Y是否属于这个集合时,我们对Y应用k次哈希函数,如果所有Hi(Y)的位置都是1(1≤i≤k),那么我们就认为Y是集合中的元素,否则就认为Y不是集合中的元素。下图中Y1就不是集合中的元素。Y2或者属于这个集合,或者刚好是一个误判。


应用布隆过滤器时,只需要由用户决定要容纳的元素数n和希望的误判率p。然后通过以下公式:


计算出位数组的长度m,然后通过m,n计算出哈希函数的个数k。


http://imtinx.iteye.com/blog/1290636


具体详解见http://www.cnblogs.com/ZJUKasuosuo/archive/2012/08/26/2657480.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值