連想ハッシュミキシング


14

純粋に機能的な設定で、一重にリンクされたリストを検討してください。その賞賛は山頂から歌われており、今後も歌われ続けます。ここでは、その多くの長所のうちの1つと、それをツリーに基づく純粋に機能的なシーケンスのより広いクラスに拡張する方法の問題に取り組みます。

問題は次のとおりです。強力なハッシュを使用して、O(1)時間のほぼ一定の構造的同等性をテストする必要があります。ハッシュ関数が構造的に再帰的である場合、つまり、hash(x:xs)= mix x(hash xs)の場合、リストのハッシュ値を透過的にキャッシュし、要素が既存のリストに結合されたときにO(1)でそれらを更新できます。リストをハッシュするためのほとんどのアルゴリズムは構造的に再帰的であるため、このアプローチは実際に非常に有用です。

しかし、一重リンクリストの代わりに、O(log n)時間で長さO(n)の2つのシーケンスの連結をサポートするツリーベースのシーケンスがあるとします。ここでハッシュキャッシングを機能させるには、ツリーが同じ線形シーケンスを表す際に持つ自由度を尊重するために、ハッシュミキシング関数を連想的にする必要があります。ミキサーは、サブツリーのハッシュ値を取得し、ツリー全体のハッシュ値を計算する必要があります。

これは、6か月前、この問題を熟考して調査するのに1日費やした場所です。データ構造に関する文献では注目されていないようです。暗号化からTillich-Zemorハッシュアルゴリズムに出くわしました。これは、ビット0と1がガロア体のエントリを持つ部分代数の2つの生成器に対応する2x2行列乗算(連想)です。

私の質問は、私が逃したものは何ですか?私の検索で見つけられなかった暗号とデータ構造に関する文献の両方に関連性のある論文がなければなりません。この問題についてのコメントと探求する可能性のある場所は大歓迎です。

編集:スペクトルのソフトと暗号の両方の強みに関するこの質問に興味があります。よりソフトな側面では、衝突を回避する必要があるが壊滅的ではないハッシュテーブルに使用できます。強い面では、同等性テストに使用できます。

回答:


2

追加:Perのコメントを読んだ後、この答えは、すでに質問で言及されているTillich-Zemorハッシュアルゴリズムの(貧弱な)バリエーションであると思います。この回答は取り下げましたが、読者(およびコメント)が読者の参考になるかもしれないと期待しています。


編集:この回答の以前の改訂版では、[ m ]でモノイド操作を使用することが提案されましたが、Perがコメントで指摘したように、グループ操作を使用することが望ましいです。

この答えは、実装が簡単なハッシュテーブル用のハッシュ関数を構築することです。品質に関する証明可能な保証は期待されていません。

すでに有限集合[シーケンスの各要素のハッシュ関数を持っていると仮定すると、M ] = {1、...、M [の各要素の解釈に関するどの}、mは有限群の要素として] Gと使用上のグループ操作G?[ m ]からGへの任意のマッピングを使用できますが、各要素のハッシュ値の情報が失われないように、マッピングは単射であることが望ましいです。また、ハッシュ関数がシーケンス内の要素の順序の違いをキャッチできるように、グループが可換でないことが望ましいです。

高速操作を可能にする有限グループについてはあまり知りませんが、そのようなグループはコーディング理論で知られていると思います。少なくともm次の対称グループを使用することはそれほど悪くないかもしれません。


1
ええ、Tillich-Zemorハッシュも行列乗算を使用します。Tillich-Zemorのように修正を加えないと、あなたの提案は機能しません。たとえば、特異行列を避けるか、0で累積し、ハッシュ統計を台無しにしなければなりません。Tillich-Zemorはガロア体で動作します。彼らのアルゴリズムの以前のバージョンは、準最適な統計を持つ生成多項式を使用していたため、特定のガロア体が非常に重要になる可能性があるため、問題がありました。
ヴォーグセンごと10

@Per:なるほど。説明ありがとうございます。次に、有限グループの使用についてはどうですか?これに対する答えを修正しました。
伊藤剛

同意する。グループの無限ファミリーを生成する最良の方法は、有限体上の行列グループを使用することです(有限単純グループの分類定理を参照)。したがって、この形式のアルゴリズムはTillich-Zemorタイプになります。
ヴォーグセンごと10

@Per:グループ理論に精通していないため、このコンテキストでは、有限体上の行列グループが対称グループよりも優れている理由がわかりません。詳しく説明してもらえますか?
伊藤剛

1
いくつかの理由があります。1つは、大きな対称グループでは効率的に計算できず、衝突抵抗のためにグループが2 ^ 128程度である必要があるということです。対照的に、特にスパース生成多項式を選択する場合、特性2の有限体上の行列を使用して非常に効率的に計算できます。それはほんの少しの操作です。
Per Vognsen

1

ハッシュ関数のほぼ普遍的なファミリー

{haバツ=aバツモッドpaZp}

ここに素晴らしいプロパティがあります:、ここで「」は連結を示します。各ツリーのハッシュ値と両方のルートでキャッシュすると操作で2つのツリーの連結のハッシュを計算できます。○は| x | O1Zphaバツ+a|バツ|hay=haバツya|バツ|O1Zp

これは連想的であり、非常に高速です。の衝突確率はです。「多項式ハッシュ関数は信頼できます」のCLRSまたはDietzfelbinger et al。を参照してください。バツyO|バツ||y|/p


1

1つの解決策は、Merkleハッシュを使用することです。不変/永続的なバイナリツリーデータ構造を使用します。各リーフノードに、そのリーフ内に含まれるデータのハッシュで注釈を付けます。2つの子のハッシュのハッシュで各内部ノードに注釈を付けます。つまり、が子持つ内部ノードであり、ハッシュ値で注釈が付けられている場合、内部ノードにハッシュ値注釈を付ける必要があります、ここではハッシュ関数です。これにより、作成されたノードごとに余分な作業のみがすべてのツリー操作に追加されます。たとえば、時間で2つのツリーのマージをサポートできます。nnnyyny=HyyHO1Olgn

別のアプローチは、可換の連想ハッシュを使用することです。ツリーのルートにラベルを付けます。ここで、はツリーの葉の値を表します。次に、https://crypto.stackexchange.com/q/11420/351で提案されているハッシュ関数の構造の1つを使用して、それが交換可能な連想プロパティを持つようにします。2つのツリーが与えられたので、それらをマージして、ルートでハッシュ値を効率的に構築できます。Hバツ1バツmバツ1バツmm

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