This page looks best with JavaScript enabled

Bloom Filter

 ·  ☕ 2 min read

Bloom filter

Bloom filter 是一個概念很簡單又好用的東西,之前看過就想記錄一下

為何要用 Bloom filter

可以快速確認一個 key 是否存在一個資料集內,且不需花太多空間來儲存這些多餘的資訊。
Hash table 也可以做到快速查詢,但空間使用量就是會多不少

演算法

一個 Bloom filter 是一個長度為 m 的 bit 陣列,配上 k 個 hash function。每個 hash function 可以隨機的把 key 對應到 m 格陣列上。

加入資料

當要把一個 key 加入資料集時,就用 k 個 hash function 對這個 key 做計算,把對應的陣列位置設成 1

查找資料

當要確認一個 key 是否在資料集內時,也是用 k 個 hash function 對這個 key 做計算。
如果陣列對應的位置所有的值都是 1,這個 key 就有"可能"存在此資料集,就可以進行搜尋,因為之前加進來的 key 們也有機會把該 key 對應到的 k 個陣列位置設為 1。
如果其中某些位置是 0,則 key 完全不可能存在此資料集。

應用場景

Cassandra DB 就有使用到 Bloom filter。
Cassandra 用的是類似 log structured merge tree 的結構,內部會有多個樹,資料可能存在任何地方,要找一筆資料時如果每顆樹都要搜尋一定會慢,所以每顆樹都會配上一個 bloom filter 來加速查詢,決定要不要搜尋這顆樹。

結論

因為 Bloom filter 只會出現 false positive 的情況 (判斷資料存在卻不存在),不會有 false negative (判斷資料不存在卻存在),所以不會有正確性的問題。出現 false positive 時只是進去搜尋沒搜尋到而已。

要達到 1% 的 false positive rate 只需要大約 10 bits/element,真的是超級節省D

詳情請參考: https://en.wikipedia.org/wiki/Bloom_filter

Share on

Marko Peng
WRITTEN BY
Marko Peng
Good man