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

  • 相关阅读:
    pta ——还原二叉树
    pta ——Topological Sort(拓扑排序)
    pta Two Stacks In One Array(简单版双向数组)
    pta Percolate Up and Down(最小堆的插入维护和删除维护)
    pta 切分表达式——写个tokenizer吧
    正则表达式基本语法详解
    pat 是否同一棵二叉搜索树
    关于java中字符、字符串、整数相加输出的小整理
    纯C语言实现的AVL树(插入&删除&前序遍历输出)
    pat Deque(双端队列)
  • 原文地址:https://www.cnblogs.com/silyvin/p/11813174.html
Copyright © 2020-2023  润新知