概要
- Bloom filter は、要素が集合に存在するかを高速かつ省メモリで判定するデータ構造
- 確率的データ構造 であり、偽陽性が発生する可能性
- ビットベクトルと 複数のハッシュ関数 を利用
- フィルタサイズやハッシュ関数数で 誤判定率を調整可能
- 多様な用途や実装例が存在し、最適化には計算式を利用
Bloom filterの基礎
- Bloom filter は、要素が集合に存在するかを 高速かつ省メモリ で判定するデータ構造
- この効率性の代償として、 確率的な誤判定(偽陽性) が発生
- 基本構造は ビットベクトル で、各要素を複数のハッシュ関数でハッシュ化し、そのインデックスのビットを1に設定
- 要素追加時は、 複数のハッシュ関数 でビットベクトルの該当ビットを1に
- 存在判定時も同様にハッシュ化し、全ビットが1なら「存在するかも」、1つでも0なら「絶対に存在しない」と判定
ハッシュ関数の選択
- 独立性と一様性 の高い、かつ高速なハッシュ関数が推奨
- 暗号学的ハッシュ関数(例:sha1)は非推奨 (速度面で不利)
- よく使われるハッシュ関数例
- murmur
- xxHash
- fnvシリーズ
- HashMix
- 実装例
- Chromium: murmur
- Plan9: シンプルなハッシュ
- RedisBloom: murmur
- Apache Spark: murmur
- influxdb: xxhash
- bloomd: murmur, SpookyHash
- Sqlite: 独自実装
- RocksDB: xxh3
- ScyllaDB: murmur
Bloom filterのサイズ設計
- フィルタサイズ(m)とハッシュ関数数(k) で偽陽性率を調整可能
- 偽陽性率の近似式: (1-e^(-kn/m))^k
- 設計手順
- 想定挿入要素数(n)を決定
- フィルタサイズ(m)を仮決定
- 最適なハッシュ関数数(k)を計算: (m/n)ln(2)
- 偽陽性率を計算し、許容範囲外ならmを再調整
性能とメモリ効率
- 挿入・判定ともに O(k) の計算量
- メモリ効率は 許容する偽陽性率 と 想定要素数 に依存
- 要素範囲が狭い場合は ビットベクトル が有利
- 要素数の見積もりが困難な場合は ハッシュテーブル や スケーラブルBloom filter が適切
主な用途
-
キャッシュの存在判定
-
ネットワークパケットのフィルタリング
-
データベースのクエリ最適化
-
バイオインフォマティクス等の大規模データ処理
- 詳細用途や実例は Wikipedia や C. Titus Brownの講演 を参照
参考文献
- Network Applications of Bloom Filters: A Survey, Broder and Mitzenmacher
- Wikipedia: Bloom filter
- Less Hashing, Same Performance, Kirsch and Mitzenmacher
- Scalable Bloom Filters, Almeida et al