首页 > 代码库 > 小智慧,大作为——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