其实对布隆过滤器的了解是因为“布隆”这个英雄!哈哈哈哈哈哈。
布隆过滤器的使用场景:
我们都知道,我们只要在浏览器的地址栏中输入url就可以访问自己想要访问的资源了,比例如http://www.baidu.com 但是有些网站你前一阵子还可以访问,但是最近访问的时候发现访问时报404,这时什么原因呢?也许是服务器被开发人员主动的关闭了,也许该网站所提供的资源不符合社会主义核心价值观,被过滤掉了。而过滤不允许访问的url就是我们布隆过滤器的一大用途。
还有下面一些用途:
1.黑名单系统。
2.垃圾邮件过滤系统。
3.爬虫的网址判重系统。
这些系统有一些特性非常适合使用布隆过滤器,那就是允许一定程度上的误判。
下面我们来看看布隆过滤器的过滤原理把。
布隆过滤器由下面几部分组成:
1.样本数(n个)。
2.哈希函数(k个)。
3.bitArray(长度为m)。
下面简述布隆过滤器的工作流程:
也就是说每输入一个url就需要对其进行K次哈希,然后将它们哈希出来的结果对m取余,然后将取余后的结果在bitArray上描黑,当然,如果已经描黑了就不用管了。
那么哈希函数的个数k和bitArray的大小m应该如何选择呢?
这其实牵扯到比较复杂的数学计算,我在下面直接给出运算的公式:
现在假设样本数为n = 100亿个,误判率为 p= 0.01%,根据公式 m = -(n*ln p)/(ln2)^2,求得m= 19.19n。
哈希函数的个数 k = ln2*(m/n) = 14.
其实在我看来,这些公式只需要知道就行了,无需深究。
布隆过滤器的使用流程
输入一个url经过k个哈希的运算,取余,然后得到k个bitArray个数组得下标,如果这个下标锁代表得值全部被涂黑(为1),那么代表该url禁止访问,我们代理服务器就会拦击该请求。返回目标路径不可达,这样就使用布隆过滤器完成了url得拦截。
需要在强调一点,布隆过滤器是存在误判的,这说由于设计原理带来的(比如hash的重复),不可避免的。但是只要误判率在一定的范围,就能接受,总结一句换就是"错杀三千,也不放过一个"。