布隆过滤器

焦旭峰 于 June 30, 2021

布隆过滤器

1、什么是布隆过滤器

布隆过滤器是1970年由布隆提出的。它实际上是一个很长的二进制向量(位数组)和一系列随机映射函数(哈希函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

2、布隆过滤器的原理

2.1、添加元素

将一个元素添加到布隆过滤器中:

  1. 使用布隆过滤器中的哈希函数对元素值进行计算,得到哈希值。
  2. 根据得到的哈希值,在位数组中把对应下标的值置为 1。

2.2、判断元素

判断一个元素是否在布隆过滤器中

  1. 使用布隆过滤器中的哈希函数对元素值进行计算,得到哈希值;
  2. 得到值之后判断位数组中对应下标位置的元素是否都为 1,如果值都为 1,那么说明这个值在布隆过滤器中,如果存在一个值不为 1,说明该元素不在布隆过滤器中。

2.3、示例

image

上图是一个由3个哈希函数和1个位数组组成的布隆过滤器。

当我们将w元素添加到布隆过滤器中时,首先使用三个哈希函数对w进行哈希运算,得到3个哈希值,然后再根据这3个哈希值将位数组中对应下标的值置1。

当我们判断w元素是否在布隆过滤器中时,同样使用这三个哈希函数对w进行同样的哈希运算,并根据3个哈希值判断位数组中对应位置的元素是否都为1,如果值都为1,说明w在布隆过滤器中;如果有一个不为1,说明该元素不在布隆过滤器中。

3、布隆过滤器的应用

  1. 判断给定数据是否存在:比如判断一个数字是否存在于包含大量数字的数字集中(数字集很大,5亿以上!)、 防止缓存穿透(判断请求的数据是否有效避免直接绕过缓存请求数据库)等等、邮箱的垃圾邮件过滤、黑名单功能等等。
  2. 去重:比如爬给定网址的时候对已经爬取过的 URL 去重。

4、布隆过滤器的优缺点

4.1、优点

相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数。另外,散列函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。

4.2、缺点

4.2.1、存在误判

如果两个元素的哈希运算结果完成相同,会导致出现误判。

例如:

对于一个给定的布隆过滤器,“我”和“me”的哈希运算值完全相同。当布隆过滤器中只存了”我”,那么判断”me“是否在布隆过滤器中时,会判断出”me“存在集合中。

4.2.2、删除困难

两个元素经过布隆过滤器的哈希运算以后可能会有一些哈希值相同,这会导致我们删除一个元素的同时(将位数组中哈希值对应下标全部置为0),会删除另一个元素。

例如:

对于一个给定的布隆过滤器,“我”和“me”的哈希运算值中都有2。当布隆过滤器中保存了”我”和”me”,那么我们删除“me”时,会将位数组中下标为2的值置0,这会导致”我“也被删除了。