详细讲解布隆过滤器的原理

什么是布隆过滤器

  布隆过滤器(Bloom Filter)是1970年由布隆提出的,布隆过滤器是一种数据结构,特点是高效地插入和查询,这个算法无需存储该元素(key)的值就可以判断某个元素是否在某个集合中。它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。

实现原理

  布隆过滤器是一个 bit 向量或者说 bit 数组,如下图:

在这里插入图片描述  实际上它是一个很长的二进制向量和一系列的随机映射函数(哈希函数)组成。我们假如二进制向量的长度为9,哈希函数的个数为3的布隆过滤器,针对元素X,三个不同的哈希函数分别生成的哈希值为1,4,8。则上图转变为:
在这里插入图片描述
同理,我们再存一个元素Y,如果哈希函数返回 4,6,9 的话,图变为:
在这里插入图片描述值得注意的是,4 这个 bit 位由于两个值的哈希函数都返回了这个 bit 位,因此它被覆盖了。此时如果进行查询元素Z是否存在,三个哈希函数返回值为1,5,8,但是第5 bit 位上的值为 0,说明没有任何一个值映射到这个 bit 位上,因此可以很确定地说 元素Z这个值不存在。
  而当我们需要查询元素X 这个值是否存在的话,那么哈希函数必然会返回 1、4、8,然后我们检查发现这三个 bit 位上的值均为 1,那么元素X 这个值可能存在,但不是一定存在的,因为随着增加的值越来越多,被置为 1 的 bit 位也会越来越多,这样某个值元素T即使没有被存储过,但是万一哈希函数返回的三个 bit 位都被其他元素置为了 1 ,那么程序还是会判断 元素T这个值存在。

注意:

  • 过小的布隆过滤器很快所有的 bit 位均为 1,那么查询任何值都会返回“可能存在”,起不到过滤的目的了。 布隆过滤器的长度会直接影响误报率,布隆过滤器越长其误报率越小。
  • 另外,哈希函数的个数也需要权衡,个数越多则布隆过滤器 bit 位置位 1 的速度越快,且布隆过滤器的效率越低;但是如果太少的话,那我们的误报率会变高。

手动java代码实现布隆过滤器

可参考:https://blog.csdn.net/qq_33709582/article/details/108407706

使用Guava提供的相关类库(推荐)

首先我们需要在项目中引入 Guava 的依赖:

 <dependency>
     <groupId>com.google.guava</groupId>
     <artifactId>guava</artifactId>
     <version>24.1.1-jre</version>
 </dependency>

实际使用

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

public class GuavaTest01 {
    public static void main(String[] args) {
        // 创建布隆过滤器对象,长度为1000,误判率是0.01
        BloomFilter<Integer> filter = BloomFilter.create(
                Funnels.integerFunnel(),
                1000,
                0.01);
        // 判断指定元素100和200是否存在
        System.out.println("添加元素之前: " + filter.mightContain(100));
        System.out.println("添加元素之前: " + filter.mightContain(200));
        // 将元素100和200添加进布隆过滤器
        filter.put(100);
        filter.put(200);
        // 判断指定元素100和200是否存在
        System.out.println("添加元素之后: " + filter.mightContain(100));
        System.out.println("添加元素之后: " + filter.mightContain(200));
    }
}

运行结果如下:

添加元素之前: false
添加元素之前: false
添加元素之后: true
添加元素之后: true

参考文章:详解布隆过滤器的原理,使用场景和注意事项

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

corlor_龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值