集合の所属判定にブルームフィルタを使う
ブルームフィルタは確率的に集合への所属を判定します。偽陰性はありませんが、偽陽性があり得ます。大きな集合に対して省スペースです。
- 1
ブルームフィルターは、m ビットのビット配列と k 個のハッシュ関数で構成されます。要素の追加:h1(x)、h2(x)、…、hk(x) の位置のビットを 1 にします。所属判定:k 個の位置すべてが 1 かを確認します。1 つでも 0 なら、その要素は確実に集合にありません。すべて 1 なら、おそらく集合にあります(偽陽性率 p ≈ (1 - e^(-kn/m))^k)。
- 2 ハッシュ計算ツール →
複数のハッシュ関数(または異なるシードの 1 つのハッシュ)で k 個の位置を計算します。k=7、m=10000 ビット、n=1000 要素の場合、偽陽性率は約 0.8% です。偽陽性を減らすには、m または k を増やしてください。各ハッシュ関数には、異なるソルト付きの SHA-256 を使ってください。
- 3 Murmur3 ハッシュ →
ブルームフィルターのハッシュには、MurmurHash3(非暗号、高速)を使ってください。ブルームフィルターに暗号学的ハッシュ関数は不要です。必要なのは速度と一様分布です。MurmurHash3、FNV-1a、xxHash が良い選択です。k 個の独立したハッシュ関数(または二重ハッシュ:i = 0..k-1 に対する h1(x) + i*h2(x))を使ってください。
よくある質問
- m と k はどう選べばよいですか?
- 要素数 n と目標の偽陽性率 p が与えられたら、m = -n*ln(p)/(ln(2))^2 ビット、k = (m/n)*ln(2) 個のハッシュ関数です。n=100 万、p=1% なら、m ≈ 960 万ビット(1.2MB)、k ≈ 7 です。フィルターは要素のサイズに関係なく 1.2MB を使います。100 万の文字列を保存するよりはるかに少ないです。
- ブルームフィルターから要素を削除できますか?
- 標準のブルームフィルターからは削除できません。ビットを 0 にすると他の要素に影響する可能性があります。削除をサポートするにはカウンタリングブルームフィルター(ビットの代わりにカウンター)、または Cuckoo フィルター(削除対応、より良い空間効率)を使ってください。ほとんどのユースケース(キャッシュ、重複除去)では、削除非対応が許容されます。
このタスクを解決するワークフロー
コンテンツのハッシュと Base64 エンコード
入力のハッシュを計算し、コンパクトな転送のためにハッシュダイジェストを Base64 としてエンコードする。 パイプライン
テキストのハッシュと整合性検証
入力テキストのハッシュを計算し、期待されるハッシュと比較して整合性を検証する。 パイプライン
テキストのハッシュと CRC32 チェックサム検証
データ整合性検証のために、暗号学的 SHA-256 ハッシュと CRC32 チェックサムの両方を計算する。 パイプライン
MD5 ハッシュ後に Base58 エンコード
MD5 ハッシュを計算し、コンパクトな表現のために Base58 としてエンコードする。 パイプライン
マルチハッシュ速度比較
入力をハッシュし、複数のハッシュアルゴリズムをベンチマークして速度と出力を比較する。 パイプライン
パスワード生成とハッシュ
ランダムパスワードを生成し、安全な保存のためにハッシュする。 パイプライン
SHA3-256 ハッシュと CRC32 チェックサム
SHA3-256 ハッシュを計算し、二重整合性検証のために CRC32 チェックサムを計算する。 パイプライン
SHA-512 ハッシュ後に Hex エンコード
SHA-512 ハッシュを計算し、可読性のために Hex としてエンコードする。 パイプライン
テキスト反転とハッシュ
テキストを反転し、その後反転結果の SHA-256 ハッシュを計算する。 パイプライン
テキストスクランブルとハッシュ
テキストをスクランブルし、その後スクランブル結果をハッシュする。 パイプライン