Skip to content

模型Model

Bloom Filter

施工中 · 内容逐步修订

Bloom filter

用多个哈希位置共享位数组实现无假阴性的插入式近似成员查询,并允许可控假阳性。

形式陈述 ​

Bloom Filter 维护初始全零的 m>0 位数组,并选择 k≥1 个映射到 [m] 的哈希函数。功能上的无假阴性只依赖置位规则;下面的误报近似另要求近似独立、均匀的哈希位置。通用哈希提供函数族设计的基础,但仅有键对碰撞界不足以推出该近似公式。插入键 x 时,把 h1(x),…,hk(x) 对应 bit 全部置为 1;查询时,任一位置为 0 就返回“确定不存在”,全部为 1 则返回“可能存在”。在只插入、不损坏状态的模型中,已插入键对应的 bit 不会复零,因此没有假阴性;未插入键可能因其他键共享位置而产生假阳性。

在哈希近似独立均匀、插入 n>0 个不同键的分析下,一位仍为零的概率约为 e−kn/m,故

pfp≈(1−e−kn/m)k.

空状态尚未置一任何位,查询总返回不存在;重复插入同一键不会增加新的独立哈希位置。固定 m>0,n>0 时,使该近似最小的哈希数为 k≈(m/n)ln⁡2,实际取相邻整数。公式描述指定随机模型下的概率,不是面对任意相关哈希和自适应攻击者的无条件保证。

直觉

Bloom Filter 不保存“哪个键占了哪个 bit”,而让所有键共享一张位图。一个零位是强证据:查询键若曾插入,该位必已被置一;全为一却无法判断这些 bit 是否来自同一个键。它用放弃精确肯定换取远小于显式哈希表的空间。

最适合的用法是过滤昂贵负查询:返回“不存在”即可停止,返回“可能存在”再访问权威存储。过滤器本身不提供值,也不能枚举成员。

Bloom Filter 的查询证据
例子与边界

设预计插入 n=1000 个不同键,位图预算为 m=10000 bit。近似最优哈希数是 10ln⁡2≈6.93,选整数 k=7 后,预计置一比例为 1−e−0.7≈0.5034,假阳性率为

(1−e−0.7)7≈0.00819.

在上述随机哈希近似下,一万个未插入键的查询约有 82 次需要到后端核实。返回“可能存在”仍要查询权威字典,不能把它当成真实成员。若位图不变而实际插入量翻倍,近似误报率升到 (1−e−1.4)7≈0.138;这说明容量估计直接决定后端多付的查询成本,而非仅影响一个抽象百分比。

普通 Bloom Filter 不能安全删除:把键 x 的某个位置清零,可能同时抹掉另一个键 y 共享的证据,使 y 出现假阴性。Counting Bloom Filter 用小计数器替代 bit 才能在适当前提下递减,但空间和溢出问题也随之增加。

商过滤器保存可解码的完整指纹多重集,用商、余数和三种状态位支持逐项改动;删除仍须由外部保证真实键存在,误报本身不能授权删除。Xor过滤器则对静态集合剥离三位置方程并逆序赋值,查询只读三项,但一般集合变化需要重新构建。这两种成员结构分别给出动态位状态与静态构建证书,不能沿用普通Bloom的清位操作。

k 并非越大越好。更多哈希最初增加查询约束,却也更快把位图填满;接近全一后,任何查询都会返回“可能存在”。若实际插入量超过设计的 n,原定假阳性率不再成立,应扩容、分层或重建。

推论与应用

Bloom Filter 用于数据库查询过滤、网络缓存、存储系统 SSTable 索引和集合差异预筛。空间预算、预计元素数和容许假阳性率共同决定 m,k,不能只报告一个哈希数量。

它与完美哈希方向相反:完美哈希为已知静态集合消除查询冲突,Bloom Filter 则允许概率性误报以压缩成员表示。二者都依赖哈希,却解决不同正确性契约。

参考资料
  • Burton H. Bloom, “Space/Time Trade-offs in Hash Coding with Allowable Errors,” Communications of the ACM 13(7), 1970, pp. 422–426.
  • Michael Mitzenmacher and Eli Upfal, Probability and Computing, 2nd ed., Cambridge University Press, 2017, §5.5.
关系图谱6 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系