EN
返回档案库

案例库 · 工程与运营 · 技术决策 · 1970

布隆过滤器用少量的误报换来了极小的内存占用

1970年,布隆的位数组回答了“可能在集合中”,且没有假阴性,只用了极少空间。

Burton H. Bloom

那一手

当集合中的条目数量巨大时,存储每个键是不可能的,但你仍然需要知道某个东西是否在集合中。布隆的例子是一个50万词的词典,其中只有10%的词使用昂贵的连字符规则:合理的检查是避免磁盘访问,但词典太大,无法在可用内存中进行无错误的哈希。

布隆过滤器使用一个位数组和几个哈希函数解决这个问题。添加一个元素会将这些位置上的位设置为1,测试时检查这些位是否都为1。如果任何一个位为0,则该元素肯定不在,因此没有假阴性;如果所有位都为1,则该元素可能在集合中,也可能只是与其他元素冲突,产生假阳性。

因为错误是单向的且可调,结构保持很小,同时消除了大部分不必要的磁盘读取。一个错误率仅为18%的哈希区域,就能消除87%的磁盘访问,而每个元素不到10个位就能达到约1%的假阳性率。

为什么管用

  • 假阳性是可以接受的,因为代价只是额外的检查,而假阴性会导致数据丢失。
  • 位数组加上几个哈希函数,每个元素只需几个位即可存储成员信息。
  • 它不需要存储实际集合,就能消除大部分昂贵的磁盘或网络查找。
值了多少让位数组说“可能”,绝不误说“不在”聪明

可以搬走什么

如果允许小概率的“是”误报,但不能出现“否”误报,那么故意接受单向错误;允许少量假阳性往往是让巨大集合装入内存的唯一方法。

后来呢

布隆过滤器广泛应用于数据库、缓存、拼写检查器和网络路由中,以避免昂贵的查找,出现在PostgreSQL、Apache Cassandra、Chromium等系统中,以及大规模缓存中;这种接受单向错误以换取空间的基本技巧已成为计算机系统中的标准做法。

资料来源

发现哪里写错了?告诉我们。

同一路聪明