Bloom过滤器

        Bloom Filter是由Burton Bloom于一九七零年在《Space/time trade-offs in Hash Coding with Errors》中提出的。Bloom Filter实际上有很多修改版本,Bloom本人提出的版本被称为Standard Bloom Filter。

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

                              image

    下面通过一个例子来说明Bloom过滤器的原理。

    假定我们存储一亿个电子邮件地址(用哈希表实现的具体办法是将每一个email地址对应成一个八字节的信息指纹(数学之美系列13) http://www.google.com.hk/ggblog/googlechinablog/2006/08/blog-post_8115.html然后将这些信息指纹存入哈希表,由于哈希表的存储效率一般只有 50%,因此一个 email 地址需要占用十六个字节。),我们先建立一个十六亿二进制(比特),即两亿字节的向量,然后将这十六亿个二进制位全部设置为零。对于每一个电子邮件地址X,我们用八个不同的随机数产生器(F1,F2, ...,F8) 产生八个信息指纹(f1, f2, ..., f8)。再用一个随机数产生器G把这八个信息指纹映射到1到十六亿中的八个自然数 g1, g2, ...,g8(g1,g2,…g8指的是这16亿个位置中的某一个,实际相当于地址值)。现在我们把这八个位置的二进制全部设置为一。当我们对这一亿个email地址都进行这样的处理后。一个针对这些 email 地址的布隆过滤器就建成了。   

                                           image

    现在,对于任意一个给定的电子邮件地址Y,可以用上面的方法来进行检验。一旦一个电子邮件Y在黑名单中,那么它经过上面两类随机数产生器处理之后所对应的8个二进制位一定为1。因此对于任何黑名单中的电子邮件地址,该方法都能准确的发现。但是对于不在黑名单的电子邮件,它所对应的8个地址有可能恰好都为1,从而造成误判。不过这种误判的概率比较小,称为误识概率。

    Bloom Filter的好处是快速,省空间。

Bloom Fliter 的一些应用技巧

    1.求两个集合的并。假设有两个Bloom Filter表示集合S1和S2,它们位数组的大小相同并使用相同的hash函数,那么要求表示S1和S2并集的Bloom Filter,只要将S1和S2的的位数组进行“或”操作即可得到。

    2.将Bloom Filter“对折”。如果想将一个Bloom Filter的大小缩小一半,那么只需要将Bloom Filter的位数组分成两半进行“或”操作,得到的结果即为所求。在查找某一元素时,需要将哈希后的索引地址的最高位屏蔽掉。

posted @ 2012-07-18 00:38  Core Hua  阅读(655)  评论(0)    收藏  举报