布隆过滤器是用来判断一个元素是否在某个集合中,他有点类似于HashSet
但是HashSet是需要存储key值的,他通过存储Key值,查看是否存在时候只需要查看HashSet是否存了就可以,数据量较小的时候是可以使用的。但是数据量很大的时候,比如存储几十亿条垃圾网站数据的时候就显得太不够用了。
布隆过滤器不同,他是使用了BIT作为标志位进行判断。
原理
布隆过滤器使用的bit数组 https://www.jianshu.com/p/2104d11ee0a2 原文作者写的很清楚,很好。我自己重敲一遍,加深理解。
布隆过滤器创建一个BIT数组,然后传来一个网页,我们用K个哈希函数计算哈希再取余然后得到他在1-8的位置
又来一个网站,同样的道理处理。
这里看到 虽然tencent与baidu都在4做了标记,但是这是互不影响的,但是可能会引发一些的问题。
这样操作之后,用户输入一个网页,我们使用同样的判断方法去到BIT数组中找看是否所有映射都被标记,如果都被标记了。注意是全都被标记了,那么这个就应该是之前被特殊标注了,是我们要过滤的网站,也只是应该。为什么是可能呢,就像我们刚才提到的,发生了碰撞,tecent与baidu都标记了4,那假如来了一个新网站,csdn他计算出结果为1,3,8,程序查看都被标记,直接过滤。与此同时还有一个问题就是我们可以进行网页录入,网页判断,但是我们不可以网页删除。就像4是两个的公共标记,我们删除一个,另一个也会出问题。
所以总结下来, 布隆过滤器有两个问题
①判断结果可能会出错
②无法删除其中数据
那么我们一个一个分析解决。
判断结果出错
这其实主要因为我们设置的区间太小,标注数据太密集。就好比买彩票,有8张彩票有奖,我们把8张有奖与2张无奖放到一起让客户抓,很容易中奖。那我们将8张彩票放到1W张没奖彩票中就不容易了,当前问题也是这道理。当然这个区间也不是越大越好,太大了内存消耗就高,这就要我们设置的相对合适了。
无法删除数据
我们不让比特数组只是存储0与1,让他存储有几个映射在这,比如上图的两个网页,4号位存2,那么Baidu删除了,4号位变为1,1 7 变为0,不会影响tencent的操作。
应用场景
① 单纯判断是否元素是否在集合中
② 通过判断元素是否在集合,减少IO 网络连接等消耗,比如前端要查看数据,要调用后端,本来要传递很多参数,但只发一个key 后端查询没有,这样前段其他数据就不用发送。
具体实现以及错误率计算
日后在更