一文搞懂布隆过滤器 (BloomFilter)
1 什么是布隆过滤器
布隆过滤器(Bloom Filter)是由布隆(Burton Howard Bloom)在 1970 年提出的。它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器本质上由一个长度为 m 的位向量组成。
基本的布隆过滤器支持两种操作:测试和添加。
用途:布隆过滤器可以用于检索一个元素是否在一个集合中。
它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
(误识别:元素不存在而说在,不会出现元素在而说不在,即在肯定在,不在可能在)
2 布隆过滤器和 HashSet 有什么不同
布隆过滤器:
基本思想:通过一个 Hash 函数将一个元素映射成一个位阵列(Bit Array)中的一个点。这样一来,我们只要看看这个点是不是 1 就知道可以集合中有没有它了。这就是布隆过滤器的基本思想。
优点:占用空间小,效率高。
缺点:存在误差率,不能删除元素。
HashSet:
基本思想:利用 Hash 函数将元素的 HashCode 取出,放在一个内部的数组或链表中,增删改查元素时一般都是根据元素的 HashCode 进行操作。
优点:使用简单,原理简单。
缺点:占用内存大,性能较低。
综上,布隆过滤器主要适用于大量数据的去重,而HashSet等数据结构适合中小量数据的去重和检验。
3 使用布隆过滤器
实现布隆过滤器的方式有很多种,比如:
Guava 实现
Redis 实现
自己实现
......
这里我们使用 Google Guava 的内置布隆过滤器做演示:
依赖:
代码:
运行结果:
原理:
布隆过滤器的核心原理就是利用位数组,将元素利用多次 Hash 映射成位,当判断是否存在时,将被查找元素按相同操作映射,当一个元素可能有多个位,当每个位都为 1 时证明该元素存在,反之则不存在。
演示:
4 手写简单的布隆过滤器
运行结果:
参考文章:
https://blog.csdn.net/wuzhiwei549/article/details/106714765
https://www.jasondavies.com/bloomfilter/
https://www.cnblogs.com/liyulong1982/p/6013002.html
版权声明: 本文为 InfoQ 作者【Barry Yan】的原创文章。
原文链接:【http://xie.infoq.cn/article/a4cd1f286ec2a1cf76ab8114d】。文章转载请联系作者。
评论