美文网首页
布隆过滤器

布隆过滤器

作者: 我是付大善人 | 来源:发表于2021-03-17 09:09 被阅读0次

    什么是布隆过滤器

    布隆过滤器是一种算法,其核心思想是通过hash运算,判断当前值的hashCode对应的数组下标是否全为1,如果是,则认为存在。否则认为不存在。
    需要说明的是,认为存在可能存在误判。但是认为不存在没有误判可能

    布隆过滤器原理

    布隆过滤器的原理是一套hash函数和一个一维数组(数组长度根据设定的误判率可以计算出来)
    当我们插入某个元素时,我们只需要将Hashcode值对应位置上的元素设为1。即插入完成
    当我们需要查找某个元素,当前值的hashCode对应的数组下标是否全为1。从插入过程我们可以看出来,如果两个元素通过hashCode方法算出来的值都一样的话,则可能产生误判。
    举个例子:
    对字符串"小明"进行hashCode函数组计算得到 100,200,300。并放入到数组中。
    对字符串"大熊"进行hashCode函数组计算得到 100,200,300。如果查找"大熊"是否存在于布隆过滤器,则会出现误判。

    布隆过滤器应用场景

    缓存场景 - 缓存穿透到数据库层。首先判断是否存在于布隆过滤器数组中,如果不存在, 直接返回。防止恶意请求打卦我们的数据库。
    不过不能完全防止,因为会有一个误判率,但是已经能抵挡大部分无效请求了。

    爬虫 - 避免爬取已经爬取过的网站

    • 如果爬取过一定不会再爬
    • 会漏掉一些网站

    布隆过滤器代码实战

    public static void main(String[] args) {
            int total = 1000000; // 总数量
            //默认误报率为0.03
            BloomFilter<Integer> bf =
                    BloomFilter.create(Funnels.integerFunnel(), total, 0.001);
            // 初始化 1000000 条数据到过滤器中
            for (int i = 0; i < total; i++) {
                bf.put( i);
            }
            // 判断值是否存在过滤器中
            int count = 0;
            for (int i = 0; i < total + 10000; i++) {
                if (bf.mightContain(i)) {
                    count++;
                }
            }
    
            //已匹配数量 1000320
            System.out.println("已匹配数量 " + count);
        }
    

    相关文章

      网友评论

          本文标题:布隆过滤器

          本文链接:https://www.haomeiwen.com/subject/bddscltx.html