ブルームフィルタは、ある要素が集合の一部であるかどうかを効率的にテストするために設計された確率的データ構造です。1970年にBurton Howard Bloom氏によって考案され、最小限のメモリ消費で大規模なデータセットを管理できることから、コンピュータサイエンスの基本的なツールとなりました。ハッシュテーブルや二分探索木のような従来のデータ構造とは異なり、ブルームフィルタは、ある要素が集合に含まれない場合には明確な答えを提供できますが、ある要素が集合に含まれる場合には確率的な答えしか提供できません。つまり、誤検出(偽陽性)の可能性はありますが、検出漏れ(偽陰性)の可能性はないということです。
ブルームフィルタの核となる概念は、初期状態ではすべて0に設定されたビットの配列と、一連のハッシュ関数を中心に展開されます。要素がブルームフィルタに追加される際に、その要素はそれぞれのハッシュ関数に入力され、ビット配列の複数の位置を生成します。その後、これらの位置のビットは1に設定されます。ある要素が集合の中にあるかどうかをチェックするには、同じ関数を使って再びハッシュ化し、対応するビットをチェックします。これらの位置のビットがすべて1であれば、その要素は集合に含まれる可能性があるとみなされ、いずれかのビットが0であれば、その要素は間違いなく集合に含まれないということになります。
ブルームフィルタの大きな利点のひとつは、その空間効率です。特に要素数が増えるほど、同じタスクに必要な他のデータ構造と比べてメモリ使用量が大幅に少なくなります。例えば、集合の要素数に関係なく、1%の偽陽性確率を達成するためには、要素あたり10ビット未満が必要です。このため、ブルームフィルタは、ネットワークルーター、データベースシステム、分散型システムなど、メモリ使用量が重大な問題となるアプリケーションで特に有用です。
しかし、ブルームフィルタには一定の制限があります。複数の要素によって設定されたビットをクリアすると偽陰性を引き起こすため、集合から要素を削除できないことが最大の欠点です。この問題に対処するために、Counting filterのようなバリエーションが開発され、各ビットが設定された回数のカウントを維持することで要素を削除できるようになりました。さらに、要素が追加されると偽陽性確率が上がるため、ビット配列のサイズとハッシュ関数の数は、予想される要素数と許容できる偽陽性確率に基づいて慎重に選択されなければなりません。
実用的なアプリケーションでは、ブルームフィルタは様々な領域で広く使われています。例えば、ビットコイン(Bitcoin/BTC)では、ユーザーが自分のアドレスを明かすことなくトランザクションを照会できるようにすることで、Simplified Payment Verification(SPV)クライアントのプライバシーを強化するために使用されています。Akamaiのようなコンテンツデリバリネットワーク(CDN)は、ブルームフィルタを使用してキャッシュストレージを効率的に管理し、不必要なデータ検索を回避することでサーバーの負荷を軽減しています。ブルームフィルタは、その確率的な性質と限界にもかかわらず、効率的でスケーラブルなシステムを設計するための貴重なツールであり続けています。