布隆过滤器

什么是布隆过滤器

布隆过滤器是一种算法,其核心思想是通过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 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);
    }

你可能感兴趣的:(布隆过滤器)