理解BloomFilter
一. 產生背景
很多時候,我們都有這樣一個需求:判斷一個元素是否存在於集合中。比如IDEA中的單詞拼寫檢查,要判斷一個用戶輸入的單詞是否在詞庫中。
我們輕易能想到的一個簡單的解決方案,就是使用一個Hash表,將所有合法的單詞都保存在Hash表中,這樣寫入和查詢的時間複雜度都爲O(1),還是很快的。但是這樣做有一個問題,就是太耗費空間。而且由於Hash表的散列衝突問題,就更加劇了空間的佔用。這時就可以應用Bloom Filter。
二. BloomFilter原理
Bloom Filter有兩個要素:
- 一個很長的二進制向量
- 一系列隨機映射函數(hash函數)
布隆過濾器的原理是:當一個元素被加入集合時,通過K個hash函數將這個元素映射成一個位數組中的K個點,並把這K個點置爲1。檢索時,我們只要看看這些點是不是都是1就(大約)知道集合中有沒有它了:如果這些點有任何一個0,則被檢元素一定不在;如果都是1,則被檢元素很可能在。這就是布隆過濾器的基本思想。
可以注意到,上面用了大約、很可能這些修飾詞,也就是說,BloomFilter是有一定誤判率的:
- 如果一個元素被判斷爲不存在,則一定不存在。
- 如果一個元素實際不存在,但是其映射到的K個位置都是1,則會將其誤判爲存在。
三. BloomFilter使用場景
- 垃圾郵件過濾
- 白名單
- 解決緩存穿透