Bloom Filter(布隆过滤器)

Posted 继科杂货店

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bloom Filter(布隆过滤器)相关的知识,希望对你有一定的参考价值。

       我们有时候需要判断一个元素是否在给定的标签集合内,例如我们想对信息去重,过滤垃圾邮箱,权限检查等等。当标签元素数量比较少时,我们用一个哈希表存储这些标签元素即可,但当元素数量特别大时,哈希空间占用非常高,此时就不再适合使用这种数据结构了。不过幸运的是,在大数据许多应用场景下,我们并不需要给出100%准确的判断,此时,一种叫做 bloom fliter(布隆过滤器)的数据结构可以很好地 tradeoff 空间、时间和准确率。


Bloom Filter

       Bloom Filter 本质上是位向量(bit vector)与哈希结合的产物。哈希表可以看做一对一的映射,为了解决哈希冲突,一个元素通过哈希映射成的对象比较大。而布隆过滤器则采取一种 tradeoff 方案,使用 k 个哈希函数将元素分别映射成 k 个占用空间少的对象——布隆过滤器中这些对象为位向量中的某一位,这些单个对象允许冲突。一个元素只有 k 个哈希映射的位向量位置全部置位才表示此元素出现在集合中。

       举个栗子。假设我们有一个 8 bit 位向量,采用三种哈希函数(h1、h2、h3)进行映射,如下图所示,a1 通过三个哈希函数映射到了位向量的第 7、5、2 位,a2 映射到了第 5、4、1 位,a3 映射到了第 5、2、1 位。如果新来一个元素映射到了第 7、5、2 位,那么我们认为这个元素存在于给定集合中。

Bloom Filter(布隆过滤器)

       当然也有可能出现误检:一个元素不存在于集合中但是其它元素恰好把该元素映射到的 k 个位置置位了。例如还是上图,假如一个新的元素通过 3 个哈希函数分别映射到第 5、4、2 个位置,那么给出的结果是它在给定集合中,但事实上它不在,这时就出现了误检。

       直觉上这种误检概率是很低的(后面我们通过理论分析误检率),所以 Bloom Filter 很好地进行了空间和准确率的折衷。而且如果希望消除这种误检也很简单,只需要简单的增加一个白名单进行剔除即可。

       所以一个 bloom filter 应该有以下元素:位向量及其 size、当前集合元素个数、使用的哈希函数个数、白名单列表、存储所有哈希函数的 vector 以及用于产生这些哈希函数的随机函数引擎。

Bloom Filter(布隆过滤器)

       布隆过滤器类的构造函数很关键,要创建之后需要用到的 k 个哈希哈数,我们这里采用全域哈希——Universal Hash(后面有时间专门讲一讲这个)。其函数族公式如下:

Bloom Filter(布隆过滤器)

       根据这个公式我们使用 lambda 表达式生成 k 个哈希函数。此处原输入对象为字符串,我们调用 c++ 自带哈希使其变为整数。(此处如果出现碰撞则后面直接 GG,这里将来可以替换成鲁棒性更高的哈希族函数直接对 string 处理)

Bloom Filter(布隆过滤器)

       要给集合中添加一个元素(加入黑名单):只需将该元素所有哈希对应的位向量相应位置置位即可。

Bloom Filter(布隆过滤器)

      添加白名单只需给相应的 set 插入一个元素即可。

Bloom Filter(布隆过滤器)

       检查一个元素是否在结合中(是否在黑名单里),首先看其是否白名单中,若不在白名单中,再检查该元素的 k 个哈希对应的位置是否全部置位即可。

Bloom Filter(布隆过滤器)


Bloom Filter 误检率

       一个 bloom filter 主要有 3 个参数——位向量的位数 m、当前集合中元素的个数 n 和使用的哈希函数个数 k,那么有如下分析(微信没有输入公式功能只能看图了!):

Bloom Filter(布隆过滤器)


Bloom Filter(布隆过滤器)

Bloom Filter(布隆过滤器)

       故 k 的最优解大致在 ln(2)m/n。当固定 m、n,变化 k 时错误率变化如下图所示

       综上误检率、位向量位数、集合中存入的元素和选取的哈希函数个数互相制约,根据不同情况的需求我们可以选定三个参数确定第四个。

总结

       本文介绍了布隆过滤器及其应用,给出了代码实现并分析了其误检率,并说明了实际中设计布隆过滤器的指导公式主要方案。本文代码在哈希函数方面还有待提高,小伙伴们可以开动大脑思考一下。



以上是关于Bloom Filter(布隆过滤器)的主要内容,如果未能解决你的问题,请参考以下文章

布隆过滤器(Bloom Filter)详解

布隆过滤器(Bloom Filter)从入门到出土

布隆过滤器(Bloom Filter)从入门到出土

布隆过滤器(Bloom Filter)

布隆过滤器(Bloom Filter)

布隆过滤器(Bloom Filter)详解