一句话定义
布隆过滤器(Bloom Filter)是一种极省内存的概率型数据结构,用来回答“这个元素在不在集合里”。它的答案只有两种:一定不存在,或者可能存在。
它是怎么工作的
底层是一个很长的比特数组(bit array),初始全是 0;再配 k 个不同的哈希函数(hash function)。
- 加入元素时:用 k 个哈希函数各算出一个位置,把这些位置都置为 1。
- 查询元素时:同样算出 k 个位置。只要有一个是 0,说明这个元素一定没加过;如果全是 1,只能说明可能存在。
打个比方:小区门卫的登记表不写名字,只打勾。每位访客按几条规则映射到几个格子,来了就把格子打勾。再来人时看这些格子——有一个没打勾,肯定没来过;全打了勾,也可能只是别人的勾恰好凑齐了。这就是假阳性(false positive)。但反过来,真来过的人格子一定都打了勾,所以不会有假阴性(false negative)。
和相邻概念的区别
| 维度 | 布隆过滤器 | 哈希表 / 集合(Hash Set) |
|---|---|---|
| 内存 | 每个元素约几个 bit | 要存完整元素,通常几十字节起 |
| 查询结果 | 一定不存在 / 可能存在 | 精确 |
| 删除元素 | 标准版不支持 | 支持 |
| 误差方向 | 只有假阳性 | 无误判 |
哈希表精确,代价是要存下每个元素;布隆过滤器用“允许误判”换来内存上的极大压缩,适合内存放不下全量集合的场景。标准版不支持删除,因为把某个位清零会影响其他元素;如有删除需求,可以用计数布隆过滤器(Counting Bloom Filter)等变体。
对从业者的实际意义
- 爬虫与搜索:判断某个 URL 是否抓过,避免重复抓取。
- 存储引擎:LSM-tree 类数据库(如 RocksDB、LevelDB)用它先判断 key 是否存在,减少无用的磁盘 IO。
- 缓存防穿透:查缓存和数据库前先过一遍布隆过滤器,挡掉明显不存在的 key。
- AI 与推荐:AI 词典:训练数据去重">训练数据去重、内容是否已曝光过、特征是否出现过的粗筛。
- 大模型服务:判断某个 n-gram 或 token 组合是否在已知集合里,做快速拦截。
调整比特数组长度和哈希个数 k,可以控制误判率:数组越长、k 越合适,误判率越低,但内存和计算开销也越大。具体参数选择和实现细节,以你所用库的官方页面为准。
