布隆过滤器解决url黑(白)名单

原理同ip白名单,不同点有两个:

(1)所有ipv4元素加起来长度为2^32 = 4g,而url hash的长度为Int.max+1 = 2^31-1 +1 =2g

(2)hash冲突

**********************************************************************

int.max 二进制 = 0 1111111, 11111111, 11111111, 11111111 = 1,...,1 - 1 = 2^31-1,索引从0开始,故保存这些hash值需要长度为2^31

**********************************************************************

(1)需要长度为2^31-1+1的bit数组,即 (2^31)/8 个byte数组(2^28=0.25g)

所在数组索引=hash/8

在byte中位索引=hash%8=hash&(8-1)

(2)多次hash,多次判断

那么随着元素的增加,插入的元素就会越多,位数组中被置为 1 的位置因此也越多,这就会造成一种情况:当一个不在布隆过滤器中的元素,经过同样规则的哈希计算之后,得到的值在位数组中查询,有可能这些位置因为之前其它元素的操作先被置为 1 了。

如图 1 所示,假设某个元素通过映射对应下标为4,5,6这3个点。虽然这 3 个点都为 1 ,但是很明显这 3 个点是不同元素经过哈希得到的位置,(也有可能是另一个元素三次hash都与本元素同)因此这种情况说明这个元素虽然不在集合中,也可能对应的都是 1,这是误判率存在的原因。

所以,有可能一个不存在布隆过滤器中的会被误判成在布隆过滤器中。

这就是布隆过滤器的一个缺陷:存在误判。

但是,如果布隆过滤器判断某个元素不在布隆过滤器中,那么这个值就一定不在布隆过滤器中。总结就是:

布隆过滤器说某个元素在,可能会被误判
布隆过滤器说某个元素不在,那么一定不在
https://blog.csdn.net/jinking01/article/details/88922887

最佳实践:

如果用多次hash,务必使用多个数组来接收,比如

一次hash情况 hash1(obj) = 4,hash1(除obj所有)!=4,证明obj不在黑名单中

三次hash情况 hash1 hash2 hash3(obj)分别是 4,5,6,hash1(obj1)!=4,hash2(obj1)=4 hash2(obj2)=5 hash2(obj3)=6 ,反而被hash2扰乱了,增加了3倍冲突可能

如果用3个数组接收

hash2(obj1)=4 hash2(obj2)=5 hash2(obj3)=6 而 hash1(除obj所有)!=4,即可判断obj不在黑名单中,因为hash1(obj)=4只找第一个数组

腾讯20亿url:https://blog.csdn.net/suyujiezhang/article/details/101195096

缺点:

1 有误判的可能,需针对具体场景使用

2 因为无法分辨哈希碰撞,所以不是很好做删除操作。

3 量少的时候,占用更大空间

使用场景

1、黑名单(白)

2、URL去重

原文地址:https://www.cnblogs.com/silyvin/p/11813174.html