布隆过滤器解决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去重