简单易懂,什么是布隆过滤器

99 阅读2分钟

简介

布隆过滤器(Bloom Filter)是一种节省空间的概率数据结构,由一个很长的二进制向量和一系列随机映射函数组成,主要用于判断一个元素是否在一个集合中。例如,判断用户名是否可能存在于用户名集合中,布隆过滤器为了效率付出的代价是它的本质是概率性的,这意味着它可能会有一些误报结果,误报意味着它可能显示用户名已被占用,但实际并没有。

当一个元素加入集合时,布隆过滤器首先通过k个散列函数将该元素映射成k个点位,然后在底层位数组中将对应的点位上的bit置为1。 当查询一个元素是否存在时,布隆过滤器会用同样的方式计算出点位信息,然后看这些点位是否都为1,如果有任意点位为0,则代表该元素一定不存在,若所有点位都为1,则代表该元素很有可能存在

底层数据结构

一个空的布隆过滤器是一个m位组成的位数组,全部初始化为0 image.png

举例说明

image.png

如上图,位数组的长度是8,散列函数个数是 3,先后保持两个元素x,y。这两个元素都经过三次哈希函数生成三个哈希值,并映射到位数组的不同的位置,并置为1。元素 x 映射到位数组的第0位,第4位,第7位,元素y映射到数组的位数组的第1位,第4位,第6位。

保存元素 x 后,位数组的第4位被设置为1之后,在处理元素 y 时第4位会被覆盖,同样也会设置为 1。

当布隆过滤器保存的元素越多被置为 1 的 bit 位也会越来越多,元素 x 即便没有存储过,假设哈希函数映射到位数组的三个位都被其他值设置为 1 了,对于布隆过滤器的机制来讲,元素 x 这个值也是存在的,也就是说布隆过滤器存在一定的误判率

重要属性

布隆过滤器包含如下四个属性:

  • k : 哈希函数个数
  • m : 位数组长度
  • n : 插入的元素个数
  • p : 误判率

实现方式

Guava实现

Redisson实现