アンチブルームフィルターはありますか?


25

A ブルームフィルタは、効率的にさまざまな値がすでに処理中に遭遇したかどうかを追跡することが可能となります。データアイテムが多数ある場合、ブルームフィルターを使用すると、ハッシュテーブルのメモリを大幅に節約できます。ハッシュテーブルと共有するブルームフィルターの主な機能は、アイテムが新しいものではない場合は常に「not new」と表示することですが、アイテムに「not new」のフラグが立てられる確率はゼロではありません「新しい場合でも。

逆の動作をする「アンチブルームフィルター」はありますか?

言い換えれば、アイテムが新しい場合は「新しい」と言う効率的なデータ構造がありますが、新しいものではないアイテムについては「新しい」と言うこともありますか?

以前に表示されたすべてのアイテムを(たとえば、並べ替えられたリンクリストに)保持することは最初の要件を満たしますが、大量のメモリを使用する場合があります。緩和された2番目の要件を考えると、それも不要であることを願っています。


より正式な治療、書き込み好む人のためにbバツ=1ブルームフィルタを考えればバツ新しいもので、bバツ=0それ以外の場合は、書き込みnバツ=1ならばバツ本当に新しいとされnバツ=0それ以外の場合。

次に、Pr[bバツ=0|nバツ=0]=1 ; Pr[bバツ=0|nバツ=1]=α ; Pr[bバツ=1|nバツ=0]=0; Pr[bバツ=1|nバツ=1]=1α、いくつかのために0<α<1

私が求めています:機能実現、効率的なデータ構造が存在しないb一部と0<β<1、そのようなことPr[bバツ=0|nバツ=0]=β ; Pr[bバツ=0|nバツ=1]=0 ; Pr[bバツ=1|nバツ=0]=1βPr[bバツ=1|nバツ=1]=1


編集:https: //stackoverflow.com/questions/635728 および/cstheory/6596としてStackExchangeでこの質問が以前に尋ねられたようです。 「の値を逆にすることで、やることは簡単bです。「正しい」答えが何であるかは私にはまだ明らかではありません。何明確なことは(イルマリKaronenによって提案された1など)は、むしろうまく機能し、ある種のLRUキャッシュ方式は、実装するのは容易なことである、と私のコードを実行するのに要する時間が50%減少しました。


何らかの理由で、これはキャッシュとキャッシュ配置アルゴリズムが解決しようとする問題に非常に似ていると言いたくなります。使用頻度が最も低い(LFU)置換を使用するキャッシュを検討してください。理論的に最適ですが、不可能な置換アルゴリズムは、キャッシュの場合と同じように、長期間表示されないアルゴリズムを排除することです。キャッシングは、一般に保持されない可能性のあるディストリビューションの性質に関するいくつかの仮定に依存していると思いますが、これが当てはまるかどうかを検討する価値があります。
Patrick87 14

次の講演に興味があるかもしれません:充足可能性に基づいたセットメンバーシップフィルター
Kaveh 14

@Kaveh:ポインターに感謝します。
アンドラスサラモン14

回答:


12

Patrick87のハッシュアイデアに沿って、これは要件をほぼ満たす実用的な構成です。古い値と誤って新しい値を間違える可能性はゼロではありませんが、簡単に無視できるほど小さくすることができます。

パラメーターおよびkを選択します。実際の値は、たとえばn = 128およびk = 16です。LET Hは、安全で暗号ハッシュ関数(少なくとも)製造のn + kの出力のビット。nkn=128k=16Hn+k

ましょのアレイである2つのk個のnビットのビット列。この配列は、合計n 2 kビットを使用して、フィルターの状態を格納します。(この配列がどのように初期化されるかは特に問題ではありません。ゼロまたはランダムビットで埋めることができます。)a2k nn2k

  • 新しい値をフィルターに追加するには、iを計算しますx、ここで iは最初の kビットを示し、 j H x )の次の nビットを示します。してみましょう = jでij=H(x)ikjnH(x)ai=j

  • がフィルターに追加されたかどうかをテストするには、i ′を計算しますx上記のように j = H x )で a i = j かどうかを確認します。はいの場合、trueを返します。そうでない場合はfalseを返します。ij=H(x)ai=j

クレーム1:偽陽性(=新しい値が誤って見られたと主張される)の確率は、です。これは、nを増やすことにより、ストレージスペースをわずかなコストで任意に小さくすることができます。特にためにN 128、この確率は、ハードウェアの故障に対する偽陽性の確率よりもはるかに小さく、実際には、であり、本質的に無視できる程度です。1/2n+knn128

特に、異なる値がチェックされ、フィルターに追加された後、少なくとも1つの誤検出が発生する確率はN 2 - N / 2 n + k + 1です。たとえば、n = 128およびk = 16の場合、50%の確率で誤検知を得るために必要な個別の値の数は約2 n + k / 2 = 2 72です。NN2N/2n+k+1n=128k=162n+k/2=272

請求項2:偽陰性の確率(誤新規であると主張=以前に追加値)以下であるここで、Nはフィルターに追加された個別の値の数です(より具体的には、テストされている特定の値が最後にフィルターに追加されたに追加され個別の値の数)。112kN1expN/2k<N/2kN


追伸 「無視できるほど小さい」という観点から見ると、128ビット暗号化は一般的に、現在知られている技術では解読不可能考えられています。このスキームから誤検知を取得することは、誰かが最初の試行で秘密の128ビット暗号化キー正しく推測するのと同じ可能性があります。(n = 128およびk = 16の場合、実際にはそれよりも約65,000倍低い可能性があります。)n+k=128n=128k=16

しかし、それでもあなたが不合理に神経質になっている場合は、いつでも切り替えることができます。それはあなたのストレージ要件を倍増でしょうが、私は安全にあなたがその名前に気にしたい任意の合計を賭けることができます誰もがなり、これまでに偽陽性を見ていないのn = 256 -とにかく、ハッシュ関数が破られていないと仮定します。n=256n=256


1
ハードウェアの誤動作の可能性に匹敵する可能性があるだけではありません。また、最初の試行で誰かがSSHログインのRSAキーを推測する可能性と比較することもできます。後者のIMOは、ソリューションの実用性を前者よりも伝えます。
R .. 14

+1非常に良い-私の理解では、これは、アイテムが実際に新品であるときに「新しい」ではないという誤った回答の(非常に小さな)機会を許可することにより、スペース効率の問題を解決します。非常に実用的で優れた分析。
Patrick87 14

1
クレーム1は、まともなハッシュ関数は衝突の可能性が低いと述べているだけです。これは、が少なくとも50程度の場合、実際にはすでに当てはまります。私のアプリケーションでは、n = 44およびk = 20は、単純な64ビットで暗号化されていないが安全な高速ハッシュ関数でうまく機能します。n+kn=44k=20
アンドラスサラモン14

@AndrásSalamon:確かに、安全な暗号化ハッシュ関数は実際にはわずかに強力な保証を提供しますが、つまり、意図的にそれらを検索しようとしても、衝突する入力を見つけることは非現実的です。が十分に大きい場合(たとえば、上記で提案したn = 128)、これは、誤検出のコストが高く、攻撃者が攻撃を見つけようとしても、完全なデータを保存する必要がないことを意味します。もちろん、非常に強力な保証が必要ない場合は、多少高い衝突リスクが許容される可能性があります。nn=128
イルマリカロネン14

1
@Newtopian 暗号化ハッシュ関数を指定した理由は、ブルートフォース(つまり、多くの入力をテストし、衝突する入力を選択する)よりも効果的に衝突を生成する既知の方法がないためです。壊れている(たとえば、最近のMD5など)。したがって、暗号化ハッシュの場合、衝突率は理想的なランダムハッシュ関数の場合と同じであるとかなり安全に想定できます。ユニバーサルハッシュ関数またはキー付きMAC(ランダムな秘密キーを使用)を使用すると、この保証がさらに強化されます。
イルマリカロネン

8

いいえ、これらのプロパティを使用して効率的なデータ構造を作成することはできません。データ構造が本当に新しい場合に「新しい」ことを保証したい場合は(そうでない場合は決して「新しい」とは言いません)実際には新しいものであり、偽陰性は許可されていません。このようなデータ構造では、すべてのデータを保持して「新規ではない」応答を行う必要があります。正確な正当化については、cssoryのpents90の回答を参照してください。

対照的に、Bloomフィルター、データ構造が新しくない場合、効率的な方法で「新しくない」と言う保証を取得できます。各アイテムは、非常に長いかもしれないが、とブルームフィルタのスケールの大きさ:特に、ブルームフィルタは、データの全てを格納するよりも効率的であることができるの項目のではなく、それらの全長。問題のデータ構造は、データ項目の数ではなく、データの合計長合わせてスケーリングする必要があります。


また、同じ質問があるため、受け入れられた答えを参照してください
ジョー14

-1それは不可能だと言ったとき、おそらくあなたが意味することを修飾すべきです。明らかに、効率的にそれを行うことが可能であり、低いエラー率でそれを行うことも可能であるため、特定の実装でいくつかのバランスをとることは実行可能でなければなりません... 「これまでのすべてのデータ」、これは質問の要求を満たすために厳密に必要ではないからです。偽陰性-答えが「新しい」ではないときに「新しい」と応答する-ここでは許可されているため、すべてのデータを保持する必要はありません。
Patrick87 14

1
この答えは完全に合理的であり、私の質問の手紙を扱っているようですが、おそらく精神ではありません。
アンドラスサラモン14

@DW回答を更新していただきありがとうございます。私はこれを答えとして残したいと思っていますが、アンチブルームフィルターの非効率性を説明するときに使用される言語にはまだ反対していますが、参照されている「詳細」についてもう少し詳しく説明することが最善だと考えています。 ..今のところ-1を残します。いくつかの古いコメントを整理しました。
Patrick87

@DW「偽陰性」では、答えが「新しくない」はずのときに「新しい」と応答するつもりです。(ここでは「直感的ではないが、「新しい」ではないことが正のケースです。)これを引き出すために「すべてのデータ」を保存する必要はありませんが、要素全体を保存する必要があると信じていますが、すべての要素ではありません-ここでの質問に対する他の回答のように、仮説的に意味のあるエラーの可能性を受け入れない限り))
Patrick87 14

6

ハッシュテーブルだけはどうですか?新しいアイテムが表示されたら、ハッシュテーブルを確認します。アイテムのスポットが空の場合、「new」を返し、アイテムを追加します。そうでない場合は、アイテムのスポットがアイテムで占められているかどうかを確認します。その場合、「not new」を返します。スポットが他のアイテムで占有されている場合、「new」を返し、スポットを新しいアイテムで上書きします。

アイテムのハッシュを一度も見たことがなければ、間違いなく常に「New」を正しく取得します。同じアイテムを見たときにアイテムのハッシュだけを見た場合、間違いなく常に「Not New」を正しく取得します。正解が「Not New」のときに「New」を取得できるのは、アイテムAを見てからアイテムBを見て、アイテムAをもう一度見て、AとBの両方が同じものにハッシュする場合だけです 重要なのは、「Not New」が間違って取得されることはないということです。


1
この種のスペース効率の問題を無視する、またはむしろ、ブルームフィルターは実際にはバケットごとにビットのみを必要とし、これにはスペースをとるのと同じくらいのバケットごとのスペースが必要なので、ブルームフィルターよりも大幅に効率が低いと思われますアイテムを表します。まあ...宇宙が有限でない限り(Wandering Logicの答えのように)、おそらくブルームフィルターのスペース効率にあまり近づけることはできないと思います。
Patrick87 14

個人的には、あなたの答えは私のものよりもずっと良いと思います。50%以上の確率が必要な場合、ブルームフィルターはバケットごとにわずかではありません。また、固定サイズであり、半分以上満たすと、偽陽性の確率が急激に増加します。拡張する便利な方法、キャッシュとして使用する便利な方法、要素を削除する便利な方法はありません。毎回ハッシュテーブルを取得します。
さまようロジック14

@WanderingLogicシングルビットの代わりに小さな飽和カウンタを使用すると、削除がサポートされます(容量が犠牲になり、カウンタが最大でない場合のみ)。
ポールA.クレイトン14

4

アイテムのユニバースが有限である場合、はい:セット内ではなくセット外の要素を記録するブルームフィルターを使用します。(つまり、対象のセットの補数を表すブルームフィルターを使用します。)

これが役立つ場所は、限られた形式の削除を許可することです。2つのブルームフィルターを保持します。彼らは空から始めます。要素を挿入すると、ブルームフィルタAに挿入します。後で要素を削除する場合は、その要素をブルームフィルタBに挿入します。削除を取り消す方法はありません。ルックアップを行うには、まずブルームフィルターAでルックアップします。一致するものが見つからない場合、アイテムは挿入されませんでした(確率1)。一致するものが見つかった場合、要素は挿入されている(または挿入されていない)可能性があります。その場合、ブルームフィルターBでルックアップを行います。一致するものが見つからない場合、アイテムは削除されませんでした。ブルームフィルタBで一致するものが見つかった場合、そのアイテムはおそらく挿入されてから削除されました。

これは実際にはあなたの質問に答えませんが、この限られたケースでは、ブルームフィルターBはまさにあなたが探している「アンチブルームフィルター」動作を実行しています。

リアルブルームフィルターの研究者は、より効率的な削除の表現方法を使用しています。MikeMitzenmacherの出版物のページを参照してください


この質問では、アイテムを処理していますが、削除はありません。ブルームフィルターからアイテムを削除せずに賛辞を保存する意味のある方法はありません
ジョー14

1
@ジョー:この問題は一般に解決できないことに同意するので、補数が有限で小さい場合に私の答えを制限しました。
さまようロジック14

1

vi

例としてip-addressesがあり、これまでに見たことがないことが表示されるたびに知りたい場合があります。しかし、それはまだ有限セットですので、あなたはあなたが期待できるものを知っています。

実際の解決策は簡単です。

  1. すべてのアイテムをカウントブルームフィルターに追加します。
  2. 1
  3. 実際の新しいアイテムを見た後、フィルターからそれを引きます。

そのため、実際には古いものの、新しいものとして認識される「誤検知」の値がある可能性があります。ただし、その値はすべてのスロットに残り、他の誰もそれを奪うことはできなかったため、新しい値に対して「新しくない」ことは決してありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.