zoukankan      html  css  js  c++  java
  • 布隆过滤器解决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去重

  • 相关阅读:
    WIN8.1优化
    Iframe跨域嵌入页面自动调整高度的办法
    win8优化
    160多条Windows 7 “运行”命令
    用 C# 代码如何实现让你的电脑关机,重启,注销,锁定,休眠,睡眠
    system32下 exe文件作用
    html高度百分比分配
    Django启程篇
    自适应网页前端设计相关
    crontab定时任务及jar包等问题
  • 原文地址:https://www.cnblogs.com/silyvin/p/11813174.html
Copyright © 2011-2022 走看看