首页 > 代码库 > 小智慧,大作为——Bloom Filter

小智慧,大作为——Bloom Filter

      知道杀毒软件的病毒库如何存储的吗,杀毒软件又是如何识别一个病毒的呢,这或许是一个很深奥的问题。但是今天学习的了一个新东西——Bloom Filter,这个设计简单的小东西却可以很好的解决这一问题,并在很多常见的地方被使用,真是小智慧大作为。所以在这里分享一下Bloom Filter这个神奇的东东。

一、Bloom Filter是什么?

     Bloom Filter是具有很好的时间和空间效率的二进制向量数据结构,它使用较少的空间来存储海量的数据对象,并可以快速查询。

二、Bloom Filter的组成

     如此神奇的东东却只有两个部分组成:数组、k个Hash函数

三、Bloom Filter的原理

    如此简单的Bloom Filter是如何实现如此强大的功能的呢?其插入过程如下图:

技术分享

四、问题

     根据上图可以看出,当obj过多时,可能出现误判的问题。即obj3经过hash函数得到值3和10,这时通过Bloom Filter会认为obj3在其中,但事实上3和10是obj1和obj2作用的结果,obj3并不在其中,这样就引入的误判率的概念。

五、参数

    Bloom Filter有三个参数:

    m——存储空间的大小(数组长度) m越大,误判率越小

    n——预判元素个数                               n越小,误判率越小

    k——hash函数的个数

六、变体

    因为Bloom Filter不能够进行删除操作,所有对Bloom Filter进行了改进。对数组的每个标记位都增加一个计数器,每新增一个符合条件的obj时,就给该位的计数器加1,这样在删除obj时只需对计数器进行减1操作即可。

七、应用

 1、验证弱密码

     将用户常见的弱密码编码到BF中,当输入弱密码时可以识别;

2、单词拼写

     将所有正确的单词编码到BF中,当输入一个单词时检查该单词是否拼写正确;

3、文本相似度

     将每篇文章都编码到BF中,对比数组的相似度;

4、识别恶意URL、病毒扫描、入侵检测

小智慧,大作为——Bloom Filter