拉黑操作之布隆过滤器
Posted 小鲸融创
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拉黑操作之布隆过滤器相关的知识,希望对你有一定的参考价值。
考虑这样的一个场景,假设某公司的
黑名单中有100亿个URL链接,
每个URL链接大小是64个字节,问:当
给定某个URL,判断
它是否在该公司的URL黑名单中。
问题一给出,我们就很容易想到一个方法,用
Hash表去解决该问题,
这个思路确实也是可以的,我们可以
把这些属于黑名单的URL通过hash函数映射到hash表中。
这样,每当
给定一个新的URL的时候,就可以直接
通过hash映射,
若在表中能找到该URL,
则给定的URL就属于黑名单中的,若
没找到,
则不属于黑名单。Hash表的存取
时间复杂度都是O(1),
效率很高,因此我们会对这个方案感到满意。
但是细想一下,
总共有100亿个URL耶,而且每个URL是64字节耶,除去空槽还有指针等占用的内存,
其余的内存至少也得100亿乘以64字节,总过
6400亿个字节啊,
约等于640G,所以这种方法很
浪费内存,如果搞分布式的话,也很浪费机器。
因此,使用Hash解决该问题会存在的缺陷是:
一次性读进内存构建 HashMap 的时候,会存在有关于资源的各种问题。
基本介绍
好,为
解决上述hash表存在的问题,我们引入了
布隆过滤器。布隆过滤器其实也是一种
集合类型的数据结构,它的优势就是为了
解决上述的浪费内存资源的问题。
但是,布隆过滤器会有失误率。这里的失误率是指:URL不属于黑名单的,但是返回的结果可能也属于黑名单。
1.
给定URL就是属于黑名单,布隆过滤器可以得到这个
URL就是属于黑名单的结果。
2.
URL
不属于黑名单,但返回的结果可能
也属于黑名单。
布隆过滤器是一个bit 数组,每一个bit它的值是0或1。长这个样子。
我们要
把一个URL映射到布隆过滤器中,需要
使用多个不同的相互独立的哈希函数生成多个哈希值,并对
每个生成的哈希值指向的 bit 位置 1。例如有一条黑名单的URL为
www.itNiShiLiu.com,
经过4个相互独立的哈希函数hash1、hash2、hash3、hash4
,分别生成了
2、4、6、8,我们就得到了下图。
好,现在又有一条黑名单URL为
www.sb.com,
经过4个相互独立的哈希函数hash1、hash2、hash3、hash4,分别生成了
2、3、5、7,然后就又变成了下图。
因此,如果当有一个URL为
www.baidu.com进到布隆过滤器,
经过哈希函数分别得到1、2、4、6。即使1、2、4、6中2、4、6是为1的,但是
第1位为0,所以
它不属于黑名单中的成员。但此时有个属于黑名单的URL为
www.sb.com进到布隆过滤器中,
经过哈希函数返回2、3、5、7,然后发现
2、3、5、7这几个位置都为1,因此布隆过滤器
返回该URL属于黑名单。但是,如果有另外一个
不属于黑名单的URL为www.taobao.com进到布隆过滤器,它
经过哈希函数返回的值也为2、3、5、7,同理,布隆过滤器此时
会返回该URL属于黑名单,所以这是
上文提到的失误率的表现。
如果
数组太小的话,而
黑名单列表的数目很多,然后它们
每个经过哈希函数后使得数组中的每一位都为1了,即以后如果要判断
任何一个URL是否属于黑名单中,那布隆过滤器都会返回
该URL是黑名单的结果,这就会造成很高的失误率。
如果
哈希函数太多而数组很小的话,那它同样会造成上述结果。
因此,有关于布隆过滤器的相关公式如下,对推导过程感兴趣的可以百度搜索一波,这里不再详细赘述了。
1) n为样本量
,就相当于上文提到的的100亿个黑名单列表。
3)求得上面的m和k之后,可以利用以下公式得出布隆过滤器的真实失误率。
以上是关于拉黑操作之布隆过滤器的主要内容,如果未能解决你的问题,请参考以下文章
不求甚解之布隆过滤器
C++从青铜到王者第二十一篇:哈希的应用之位图布隆过滤器
亿级数据之过滤器布隆过滤器
大数据之布隆过滤器学习
hbase之布隆过滤器
Redis 高级主题之布隆过滤器(BloomFilter)