BloomFilter的原理与应用

原理

Bloom filter是一种hash算法,可以认为该算法的目的是高效地判断某个元素是否在一个特定集合中。

该算法涉及到三种数据类型:

    -- 数据集合S

    -- 一个数组,该数组的元素类型是bit,记为A

    -- k个hash函数,每个Hash函数记为Hk

扫描二维码关注公众号,回复: 1290088 查看本文章

初始情况下,bit数组所有元素为0。

插入一个元素时,将每个hash函数Hk应用到到该元素,产生k个值。可以用取模的方法将这k个值映射到数组A的k个位置,并将这k个位置上的值置为1。

例如,我们有三个hash函数,数组的长度是10。插入一个元素时,数组的状态可能是这样的:

                 X

                 |

                 V

      H1(X)   H2(X)   H3(X)

                 |

                 v

+---------------------------------------+

| 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |    bit array

+---------------------------------------+

下面,我们的问题是判断另外一个元素Y是否在集合中。将所有的hash函数应用到Y,产生k个位置,我们检查数组A上的这k个位置上的值。如果有至少一个位置的值是0,那么Y肯定不在集合中。

问题是,如果所有的位置上的值都为1,我们能得到什么结论?我们不能确定Y是否一定在集合中,Y可能在,也可能不在。所以,通过Bloom filter我们得到一个元素不在集合的结论是正确的。

应用

-- bloom filter在Cassandra的应用

BigTable和Cassandra使用Bloom filter快速判断某个key不在文件中。Cassandra论文中这样描述:

When a disk lookup occurs we could be looking up a key in multiple files on

disk. In order to prevent lookups into files that do not contain the key, a

bloom filter, summarizing the keys in the file, is also stored in each data

file and also kept in memory. This bloom filter is first consulted to check if

the key being looked up does indeed exist in the given file.

当查找一个key时,会发生磁盘扫描。为了提高效率,我们不会扫描不存在某个key的文件。为了做到这一点,一个bloom filter维护了某个数据文件的所有key信息,并且这个bloom filter也持久化在数据文件。可以优先利用这个bloom filter判断这个key是否在该数据文件中,这样,不保存这个key的数据文件就不会被查找。

-- bloom filter在chrome的应用

chrome拥有一个能检测用户访问的url是否安全的功能。url的数量巨大,但是,不安全的url的数量相对比较少。一个最简单的方法是在用户每次访问某个url时,都调用安全检查服务来判断这个url是否安全。这个最简单的方法有两个缺陷:1)严重影响用户体验,毕竟多了一次网络的访问。2)急剧增加安全检查服务的压力。chrome利用bloom filter优雅地解决了这个问题。大致的原理是:将那些不安全的url进行hash,存储到一个bloom filter中,当需要检查某个url是否安全时,首先检查这个url是否会落到这个bloom filter中,如果不在bloom filter,可以很肯定地判断这个url是安全的。如果落在bloom filter,因为bloom filter的特点,我们还无法知道这个url是否一定是不安全的,这个时候可以访问安全检查服务进行检查。这个方法可以用很小的bloom filter检测数亿计的url。

猜你喜欢

转载自bofang.iteye.com/blog/1891122