news 2026/1/24 19:14:56

一文搞懂纸老虎-布隆过滤器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一文搞懂纸老虎-布隆过滤器

在工程里,我们经常遇到一种很现实的需求:

我只想快速判断某个值“在不在集合里”。
最好别占太多内存,速度还要快。

如果你把所有元素都放进HashSet或数据库索引里,当然能做到“准确判断”,但代价可能是:内存贵、磁盘慢、网络更慢。尤其在一些非关系型数据库(NoSQL)或分布式系统里,“查一个根本不存在的键”,反而可能触发多机查询、磁盘寻址、甚至跨网络请求——成本很高

这时候就轮到 Bloom Filter(布隆过滤器)登场了:一种节省空间的概率型数据结构,常用于回答这个问题:

  • 这个值在不在?
    • 一定不在
    • 可能在

它的哲学很明确:
牺牲一部分“准确性”,换取更小的内存占用与更快的判断速度。


1. Bloom Filter 是什么?一句话概括

Bloom Filter 是一种空间效率极高的概率数据结构,用于集合成员查询(membership test)。

它的回答只有两种:

  1. 一定不在(No,100% 准确)
  2. 可能在(Maybe,有一定误判率)

注意这个“误判”的方向是单向的:

  • 可能把“不存在”的元素误判为“存在”(假阳性 false positive
  • 但不会把“存在”的元素误判为“不存在”(不会出现假阴性 false negative

所以你可以记成一句工程口诀:

Bloom Filter:不在是铁证,是猜测。


2. 为什么它会“误判”?(但仍然好用)

Bloom Filter 的内部结构非常朴素:

  • 一段长度为m的位数组(bit array),初始全是 0
  • k个 hash 函数

插入一个元素时发生什么?

对元素做k次 hash,得到k个位置,把这些位置的 bit 全部置为 1。

查询一个元素时发生什么?

同样 hashk次,看对应k个 bit:

  • 只要有任意一个 bit 是 0 →一定不在
  • 如果k个 bit 全是 1 →可能在

误判的根源就在于:
不同元素经过 hash 可能会把同一批 bit 位置置为 1,久而久之,某个“不存在的元素”查询时刚好命中了一组全 1 的 bit,于是被判定为“可能在”。

这就是 Bloom Filter 的“概率性”。


3. 它到底省在哪里?为什么能省很多内存?

如果你用HashSet保存大量字符串/URL/ID:

  • 不仅要存元素本身
  • 还有对象头、指针、哈希桶、装载因子等额外开销

而 Bloom Filter 只存bit

  • 每个位置 1 bit
  • 不存原始值
  • 不存指针结构
  • 不需要扩容搬迁(通常初始化后固定)

这让它在“只想拦掉大量不存在查询”的场景里非常划算。


4. 适用场景:能容忍误判的地方,它就是神器

Bloom Filter 的典型使用方式是当作“第一道门”(pre-check):

4.1 数据库/缓存:避免查不存在的键

在一些 NoSQL 或分布式 KV 存储里,查询不存在 key 的代价可能很高(磁盘、跨节点、跨机房)。

做法:

  1. 先查 Bloom Filter
  2. 如果判定“一定不在” → 直接返回,不打到存储层
  3. 如果“可能在” → 再去真正存储查(此时才付出成本)

它减少的是:大量无意义的 I/O 与网络开销

4.2 安全/风控:过滤恶意 URL(经典案例)

业界常提到:Google 曾在安全浏览(Safe Browsing)或类似系统里用 Bloom Filter 来做快速过滤:

  • 本地用 Bloom Filter 先判断某 URL 是否“可能在黑名单”
  • 若“可能在”,再进一步请求更精确的数据/校验

这样既能节省带宽,也能提高响应速度。

4.3 其他常见场景

  • 爬虫去重(先用 Bloom Filter 粗筛,减少重复抓取)
  • 日志/埋点去重(容忍少量误判)
  • 消息队列幂等预判(“可能处理过”则走更重的校验路径)

一句话:

适合“误判可以接受,但漏判不能接受”的场景。


5. Bloom Filter 的关键:好的 Hash 函数与参数选择

你提到“Bloom filter 的关键在于拥有足够优秀的 hash 函数”——非常对。

Bloom Filter 的效果由几件事共同决定:

  • m:bit array 长度(越大越不容易全被置 1)
  • n:预计插入元素数量(越多越容易冲突)
  • k:hash 函数个数(太少判定不够严,太多会把 bit 更快置满)
  • hash 函数质量:分布要均匀、碰撞要少、速度要快

工程里常见做法:

  • 选用成熟的非加密 hash(如 MurmurHash、xxHash)来保证速度与分布
  • 用“双重哈希”(double hashing)从 2 个 hash 推导出 k 个位置,减少计算成本

Bloom Filter 不要求 hash “不可逆”,而是要求快、均匀、低碰撞、可重复


6. 权衡策略:你到底在牺牲什么?

Bloom Filter 的本质是一个权衡:

  • 你换来:更低内存、更快查询、更少 I/O
  • 你付出:假阳性(误判“在”)

但注意:
误判“在”并不会直接给最终结果判死刑,因为 Bloom Filter 通常只是预过滤。它只会导致:

  • 多做一次后续查询(比如访问数据库/缓存)
  • 或进入更严格的校验流程

不会导致把真实不存在的数据当作存在直接返回(因为后面还有真实查证)。


7. 小结

Bloom Filter 的精髓可以浓缩成三句话:

  1. 它是一种节省空间的概率数据结构,用于集合成员查询
  2. “不在”一定准确,“在”可能误判
  3. 适合容忍少量误判、但不能漏判的工程场景,尤其用来减少昂贵的不存在查询
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/27 1:57:55

计算机视觉_CNN与目标检测实战

目录引言计算机视觉基础图像的数字化表示图像预处理卷积神经网络(CNN)基础卷积操作池化层激活函数构建完整的CNN模型目标检测基础边界框表示非极大值抑制(NMS)实战项目:简单的目标检测器数据准备简化的YOLO风格检测器训…

作者头像 李华
网站建设 2026/1/17 14:55:17

基于SpringBoot的同城宠物服务管理系统

同城宠物服务管理系统的课题背景 随着城市化进程加快和居民生活水平提高,宠物经济成为新兴消费热点。宠物已从单纯的看家护院角色转变为家庭重要成员,宠物饲养率逐年攀升,带动宠物食品、医疗、美容、寄养等服务需求激增。然而,传统…

作者头像 李华
网站建设 2026/1/23 4:31:19

【深度学习新浪潮】用AI工具解析美联储新闻,搭建量化投资分析流水线

更多分析内容,请参考我们的浮游会播客:美联储降息竟然影响你的钱包?如何把握机会、守住财富? 引言:美联储新闻+AI,解锁投资决策新范式 美联储作为全球货币政策的“锚点”,其利率决议、会议声明、官员讲话等每一条新闻都可能引发全球资产剧烈波动。但传统分析模式面临两…

作者头像 李华
网站建设 2026/1/9 16:24:55

Android 14.0 监听某个app启动或者退出功能实现

1.前言 在进行14.0的系统定制开发中,在某些app的定制过程中,需要知道某个app的启动记录和退出记录, 所以就需要监听某个app的启动和退出的过程,需要在Activity的生命周期中来实现监听功能 2.监听某个app启动或者退出功能实现的核心类 frameworks\base\core\java\android…

作者头像 李华
网站建设 2026/1/18 11:55:02

DNP3设备数据 转 IEC104项目案例

目录 1 案例说明 2 VFBOX网关工作原理 3 准备工作 4 配置网关采集DNP3协议数据 5 启用IEC104协议转发数据 6 测试网关的104功能 7 网关通过4G连接104平台 8 案例总结 1 案例说明 设置网关采集DNP3协议设备数据把采集的数据转成IEC104协议转发给其他系统。 2 VFBOX网关…

作者头像 李华
网站建设 2025/12/24 0:36:43

DDR应用专题总结

一、DDR设计之硬件设计 1.DDR硬件设计是T型结构还是非T型结构,直接关系到DDR能够跑的最高速率 2.DDR核电1.5v/1.8v/2.0v选择很重要,关系到DDR速率是否能够跑高二、MIG复位 1.mig核的init_cmpl概率性性起不来,需要在逻辑中设计一个复位&#x…

作者头像 李华