# Bloom Filter算法

Bloom filter是一种性能提升的手段,发明者为Burton Bloom。

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

布隆过滤器类似于HashSet,区别在于布隆过滤器不需要保存key值(不需要保存set元素),因此其占用空间较少,具有安全性。

# 实现

创建一个Set的基本方式,我们可以使用hash函数,将每个元素映射为hash编码。布隆过滤器也是采用如下思想:

  • 一个很长的二进制向量(位数组)。
  • 一系列稀疏哈希函数。

布隆过滤器的思想是使用n个hash函数,使每个元素通过n次hash获得n个hash值,并在很长的二进制向量中标记对应位置。

# 添加元素

  1. 使用n个哈希函数计算出给定元素的n个映射值。
  2. 将二进制向量上n个位置置为1。

# 查找元素

  1. 使用n个哈希函数计算出给定元素的n个映射值。
  2. 在对应二进制向量上依次查找n个位置,如果均为1,则元素可能存在,只要有一个位置位0,则元素一定不存在

# 复杂度与限制

布隆过滤器的查找复杂度为O(n),n为哈希函数的数量。

正如hash的方式本身带来的问题一样,布隆过滤器计算hash时不同元素会存在hash冲突,因此即使查找元素时n个位置均为1,也可能存在误判。反过来,如果n个位置有0,那么可以肯定该元素一定不存在。

另一个限制是虽然布隆过滤器本质上是一个Set,但由于hash映射可能存在误判,因此删除元素的操作一般是禁止的(不然就错上加错)。

利用这一特点,可以做URL过滤,黑名单过滤等操作。