什么是布隆过滤器?

布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,由 Burton Howard Bloom 在 1970 年提出。

“概率型数据结构”(Probabilistic Data Structure)是指一类在处理数据时,为了换取极高的空间效率或计算速度,允许在结果中存在一定误差(通常是概率性的)的数据结构。

它主要用于判断一个元素是否在一个集合中

核心结论

  • 如果布隆过滤器判断元素不在集合中:那么该元素一定不在集合中(100% 准确)。
  • 如果布隆过滤器判断元素在集合中:那么该元素可能在集合中,也可能不在(存在一定的误判率)。

工作原理

布隆过滤器的底层是一个位数组(Bit Array)和一组哈希函数(Hash Functions)

1. 初始化

创建一个长度为 m 的位数组,所有位初始化为 0

2. 添加元素

当一个元素被加入集合时:

  • 通过 k 个不同的哈希函数计算出 k 个哈希值。
  • 将位数组中对应的 k 个下标的值设为 1

3. 查询元素

当查询一个元素是否存在时:

  • 同样通过那 k 个哈希函数计算出 k 个下标。
  • 检查位数组中这 k 个位置的值:
    • 如果有任何一个位是 0,则该元素一定不存在
    • 如果所有位都是 1,则认为该元素可能存在

优缺点

优点

  1. 空间效率极高:它不需要存储原始数据,只存储位的状态。
  2. 查询速度极快:哈希计算和位查找的时间复杂度都是 ,与集合中的元素数量无关。

缺点

  1. 存在误判(False Positives):不同的元素可能哈希到相同的位。
  2. 难以删除:由于一个位可能被多个元素共享,直接将某位改为 0 会影响其他元素的判断。
    • 注:计数布隆过滤器(Counting Bloom Filter)可以解决删除问题,但会消耗更多空间。

应用场景

1. 解决缓存穿透

在访问数据库之前,先通过布隆过滤器过滤掉那些数据库中肯定不存在的 ID,从而保护数据库。

2. 垃圾邮件过滤

判断一个邮件地址是否在黑名单中。

3. 爬虫去重

在爬取海量 URL 时,判断某个 URL 是否已经抓取过。

4. 数据库索引

Google Bigtable、Apache HBase 和 Cassandra 使用布隆过滤器来减少对不存在的行或列的磁盘寻址。