【ぶるーむふぃるた】

ブルームフィルタ とは?

💡 「たぶん含まれる」か「絶対ない」を超省メモリで判定
📌 このページのポイント
ブルームフィルタの仕組み 要素 "cat" Hash1 → 2 Hash2 → 5 Hash3 → 9 ビット配列 0 [0] 0 [1] 1 [2] 0 [3] 0 [4] 1 [5] 0 [6] 0 [7] 0 [8] 1 [9] 0 [10] 「含まれない」は100%正確 全ビットが1でなければ確実に不在 「含まれる」は偽陽性の可能性 全ビット1でも別要素の可能性あり
ブルームフィルタのイメージ
ひよこ ひよこ

普通にHashSetで判定すればいいのでは?

ペンギン先生 ペンギン先生

1億個のURLが集合にあるか判定する場合、HashSetだと数GBのメモリが必要。ブルームフィルタなら同じ要素数で偽陽性率1%でも約120MBで済む。「確実に存在しない」がわかれば十分なケースが多いんだ。存在するかもしれない場合だけ本格的な検索に進む二段階チェックが典型的な使い方だよ

ひよこ ひよこ

どうやって動くの?

ペンギン先生 ペンギン先生

①kビット長のビット配列を0で初期化、②要素追加時にk個のハッシュ関数で位置を計算し、そのビットを1にする、③判定時にk個のハッシュ関数で位置を計算し、すべてのビットが1なら「たぶん含まれる」、1つでも0なら「確実に含まれない」。他の要素のハッシュが偶然同じビットを立てるのが偽陽性の原因だよ

ひよこ ひよこ

どこで使われている?

ペンギン先生 ペンギン先生

①Chromeのセーフブラウジング(悪意あるURLの判定)、②Cassandraのデータ読み取り(存在しないキーのディスクアクセスを回避)、③Mediumの「この記事はもう読んだ」判定、④ビットコインのSPVノード。キャッシュの前段でDBにないキーへの無駄なクエリを防ぐのも定番の使い方だよ

ひよこ ひよこ

削除はできるの?

ペンギン先生 ペンギン先生

標準のブルームフィルタは削除できない。ビットを0に戻すと他の要素の判定に影響するから。削除が必要ならCounting Bloom Filter(各ビットをカウンターにする)やCuckoo Filter(削除可能で偽陽性率も低い)を使う。実務ではRedisのBFモジュールやGuavaのBloomFilterが簡単に使えるよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ブルームフィルタ」って出てきたら「省メモリで集合の存在判定をする確率的データ構造」と思えればだいたいOK!
📖 おまけ:英語の意味
「Bloom Filter」 = ブルームのフィルタ
💬 1970年にBurton Howard Bloomが発明。半世紀以上使われている名作データ構造だよ
← 用語集にもどる