直观的说,bloom 算法类似一个 hash set,用来判断某个元素(key)是否在某个集合中。
和一般的 hash set 不同的是,这个算法无需存储 key 的值,对于每个 key,只需要 k 个比特位,每个存储一个标志,用来判断 key 是否在集合中。

算法:

  1. 首先需要 k 个 hash 函数,每个函数可以把 key 散列成为 1 个整数
  2. 初始化时,需要一个长度为 n 比特的数组,每个比特位初始化为 0
  3. 某个 key 加入集合时,用 k 个 hash 函数计算出 k 个散列值,并把数组中对应的比特位置为 1
  4. 判断某个 key 是否在集合时,用 k 个 hash 函数计算出 k 个散列值,并查询数组中对应的比特位,如果所有的比特位都是 1,认为在集合中。

优点:不需要存储 key,节省空间

缺点:

  1. 算法判断 key 在集合中时,有一定的概率 key 其实不在集合中
  2. 无法删除

典型的应用场景:
某些存储系统的设计中,会存在空查询缺陷:当查询一个不存在的 key 时,需要访问慢设备,导致效率低下。
比如一个前端页面的缓存系统,可能这样设计:先查询某个页面在本地是否存在,如果存在就直接返回,如果不存在,就从后端获取。但是当频繁从缓存系统查询一个页面时,缓存系统将会频繁请求后端,把压力导入后端。

Reference