布隆过滤器原理
布隆过滤器(Bloom Filter)是一种空间效率高、查询速度快的概率型数据结构,主要用于判断某个元素是否在一个集合中。它的核心特点是:
判断为“存在”可能是错的(有一定误判率)
判断为“不存在”一定是对的
一、布隆过滤器的基本原理
布隆过滤器是一个**位数组(bit array)和多个哈希函数(Hash Functions)**组成的。
1. 初始化
假设有一个长度为
m
的位数组bit[]
,初始每一位都是0
有
k
个不同的哈希函数:hash1, hash2, ..., hashk
2. 添加元素 x
对
x
分别使用k
个哈希函数,计算出k
个下标位置:hash1(x) % m, hash2(x) % m, ..., hashk(x) % m
将这
k
个位置上的bit[i]
都置为1
3. 查询元素 y
是否存在
对
y
同样使用k
个哈希函数,得到k
个位置检查这些位置是否都为
1
:如果有任何一个位置为 0:说明
y
一定不在集合中如果所有位置都是 1:可能存在,但不能百分百确认(可能是其他元素造成了这些位置为 1)
二、示意图(简化)
bit array: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
添加 "apple" → hash1=3, hash2=7, hash3=1 → 置位:bit[3]=1, bit[7]=1, bit[1]=1bit array: [0, 1, 0, 1, 0, 0, 0, 1, 0, 0]查询 "apple":
→ 取同样3个位置,如果全是1,返回“可能存在”查询 "banana":
→ 假如 hash 到 bit[1], bit[4], bit[6] → bit[4] 为0 → 一定不存在
三、布隆过滤器的特点
✅ 优点:
空间效率高:相比于用 set/hashset 来存储大量字符串,内存节省非常多
插入、查询速度快:时间复杂度为
O(k)
,k
是哈希函数数量
❌ 缺点:
可能误判存在(误判率可控制,但不能为 0)
不能删除元素(除非使用 Counting Bloom Filter)
无法获取元素,只能判断存在性
四、布隆过滤器的使用场景
防止缓存穿透(判断 key 是否可能存在于数据库中)
黑名单系统(判断一个 IP 是否可能为恶意)
网络爬虫去重(判断 URL 是否已抓取过)
区块链、分布式系统中快速去重或状态判断
五、误判率与参数关系(高级)
布隆过滤器的误判率与以下有关:
n
:插入的元素个数m
:位数组大小k
:哈希函数数量
误判率公式近似为:
P=(1−e−kn/m)kP = \left(1 - e^{-kn/m} \right)^k
可以通过这个公式反推设计布隆过滤器所需的 m
和 k
来满足特定的误判率要求。