1970年,Burton Howard Bloom在ACM通讯上发了一篇6页的论文。没人想到,这个用来加速拼写检查的方案,会在半个多世纪后成为Google、Chrome、比特币网络的底层基础设施。更反直觉的是:它主动放弃精确性,却因此赢得了规模。

「可能」与「一定不」的数学魔术

打开网易新闻 查看精彩图片

布隆过滤器(Bloom Filter)的核心设计只有一行代码能说完:用多个哈希函数把元素映射到一个位数组,查询时只要有一位为0,就确定不存在。

这个结构有两个致命特性。第一,假阴性概率为零——如果过滤器说「不在」,那一定不在。第二,假阳性概率可控——如果过滤器说「在」,实际有p%的概率是误判。这个p%可以通过调整位数组大小和哈希函数数量来压缩。

Bloom本人在论文里算过一笔账:存储100万个元素,允许1%误判率,只需要1.14MB空间。如果用哈希表存同样的数据,内存开销是它的8-10倍。

代价是删除困难。标准布隆过滤器不支持删除,因为多个元素可能共享同一位。Counting Bloom Filter用4位计数器替代单一位,把空间开销提到4倍,才换来删除能力。

正方:为什么大厂离不开它

Google Bigtable用布隆过滤器减少磁盘查找。每次读操作先查内存里的过滤器,如果确定不存在,直接跳过磁盘访问。论文数据显示,这一层拦截让查询延迟从毫秒级降到微秒级。

Chrome的恶意网址检测是更典型的场景。Google维护着数十亿条危险URL,不可能全塞进用户浏览器。解决方案是定期推送布隆过滤器——4.3MB的过滤器可以覆盖99.8%的查询,误判率万分之一。用户访问网址时,本地先查过滤器:如果显示「安全」,直接放行;如果显示「危险」,再向服务器二次确认。

比特币网络把它用在了SPV(简单支付验证)轻节点。全节点给轻节点发送区块时,附带一个布隆过滤器。轻节点用过滤器快速判断交易是否与自己相关,无需下载完整区块数据。一个手机钱包因此能运行在几百KB内存里。

数据库领域,PostgreSQL的pg_bloom扩展、Redis的RedisBloom模块、Cassandra的布隆过滤索引,都是同一套逻辑:用可控的不确定性,换确定的性能提升。

反方:这些场景真的非它不可吗?

批评者的核心质疑是:布隆过滤器的优势窗口正在收窄。

内存变便宜了。2024年AWS的r7g实例,每GB内存成本是2014年的1/8。当年需要精打细算的1MB空间,现在可能不如工程师的调试时间值钱。

Cuckoo Filter(布谷鸟过滤器)2014年提出后,在多个维度上压制了布隆过滤器:支持删除、查询更快、空间效率更高(相同误判率下少30%空间)。Facebook的RocksDB已经把默认过滤器从布隆换成了布谷鸟。

更根本的质疑来自业务侧。布隆过滤器的「假阳性」特性,意味着它只能做第一道关卡,不能替代最终校验。Chrome的万分之一误判,在十亿级用户面前就是十万次不必要的云端查询。这些隐藏成本很少被计入技术选型。

机器学习带来的新方案也在挤压生存空间。Learned Index用神经网络预测数据位置,在特定分布下比布隆过滤器更快、更省空间。虽然通用性不足,但在日志分析、时序数据等场景已经开始落地。

我的判断:它不会消失,但角色在迁移

布隆过滤器的真正价值,不在于技术参数的最优,而在于工程决策的简洁性。

它的实现可以塞进100行代码。没有超参数需要调优,没有训练数据需要维护,没有版本兼容性需要担心。这种「可审计的确定性」,在合规严格的金融、医疗场景反而是优势。

它的位置也在下沉。从「核心优化手段」变成「防御性基础设施」——像CPU缓存一样默认存在,但很少被单独讨论。Chrome的4.3MB过滤器、比特币的SPV协议,都是用户无感知的设计。

一个有趣的信号:2023年ACM图灵奖颁给了向量数据库和近似最近邻搜索。这暗示着整个行业正在向「有控误差」的计算范式迁移。布隆过滤器是这个方向的先驱,但不再是终点。

如果你正在做技术选型,关键问题不是「用不用布隆过滤器」,而是「误差预算怎么分配」。把确定性留给核心业务,把不确定性压缩到可接受的边界——这个1970年的设计哲学,可能比具体实现活得更久。

最后一个问题留给你:在你的系统里,有哪些「必须准确」的环节,其实可以承受万分之一的误差?这1%的松弛空间,能换回多少性能或成本?