Assoziatives Hash-Mischen

14

Betrachten Sie die einfach verknüpfte Liste in einer rein funktionalen Umgebung. Sein Lob wurde von den Berggipfeln gesungen und wird auch weiterhin gesungen. Hier werde ich auf eine seiner vielen Stärken und die Frage eingehen, wie sie auf die breitere Klasse rein funktionaler Sequenzen auf der Basis von Bäumen ausgedehnt werden kann.

Das Problem ist das Folgende: Sie möchten in O (1) -Zeit durch starkes Hashing auf nahezu sichere strukturelle Gleichheit testen. Wenn die Hash-Funktion strukturell rekursiv ist, dh hash (x: xs) = mix x (hash xs), können Sie Hash-Werte in Listen transparent zwischenspeichern und in O (1) -Zeit aktualisieren, wenn ein Element in eine vorhandene Liste aufgenommen wird . Die meisten Algorithmen für Hashing-Listen sind strukturell rekursiv, so dass dieser Ansatz in der Praxis hervorragend anwendbar ist.

Angenommen, Sie haben anstelle von einfach verknüpften Listen baumbasierte Sequenzen, die die Verkettung von zwei Sequenzen der Länge O (n) in der Zeit O (log n) unterstützen. Damit das Hash-Caching hier funktioniert, muss die Hash-Mischfunktion assoziativ sein, um die Freiheitsgrade zu berücksichtigen, die ein Baum bei der Darstellung derselben linearen Sequenz hat. Der Mischer sollte die Hash-Werte der Teilbäume nehmen und den Hash-Wert des gesamten Baums berechnen.

Hier war ich vor sechs Monaten, als ich einen Tag lang über dieses Problem nachdachte und es untersuchte. Es scheint in der Literatur zu Datenstrukturen keine Beachtung gefunden zu haben. Ich bin auf den Tillich-Zemor-Hashing-Algorithmus aus der Kryptographie gestoßen. Es basiert auf der 2x2-Matrixmultiplikation (die assoziativ ist), wobei die Bits 0 und 1 den beiden Generatoren einer Subalgebra mit Einträgen in einem Galois-Feld entsprechen.

Meine Frage ist, was habe ich vermisst? Es muss sowohl in der Literatur zu Kryptographie als auch zu Datenstrukturen relevante Artikel geben, die ich bei meiner Suche nicht gefunden habe. Alle Kommentare zu diesem Problem und möglichen Orten zu erkunden, wäre sehr dankbar.

Edit: Ich interessiere mich für diese Frage sowohl an den weichen als auch an den kryptografisch starken Enden des Spektrums. Auf der weicheren Seite kann es für Hash-Tabellen verwendet werden, bei denen Kollisionen vermieden werden sollten, aber nicht katastrophal sind. Auf der stärkeren Seite kann es für Gleichstellungstests verwendet werden.

Per Vognsen
quelle

Antworten:

2

Hinzugefügt : Nachdem ich Per's Kommentare gelesen habe, denke ich, dass diese Antwort nur eine (schlechte) Variante des Tillich-Zemor-Hashing-Algorithmus ist, der bereits in der Frage erwähnt wurde. Ich ziehe diese Antwort zurück, lasse sie aber in der Hoffnung, dass sie (und die Kommentare) für einige Leser informativ sein könnten.


Bearbeiten : Eine frühere Überarbeitung dieser Antwort schlug vor, eine Monoid-Operation für [ m ] zu verwenden. Wie Per jedoch in einem Kommentar hervorhob, ist es wünschenswert, eine Gruppenoperation zu verwenden.

In dieser Antwort geht es darum, eine Hash-Funktion für Hash-Tabellen zu erstellen, die einfach zu implementieren ist. Eine nachweisbare Garantie auf die Qualität wird nicht erwartet.

Angenommen, Sie haben bereits eine Hash-Funktion für jedes Element einer Sequenz zu einer endlichen Menge [ m ] = {1,…, m }. Wie wäre es dann, wenn Sie jedes Element von [ m ] als Element in einer endlichen Gruppe G interpretieren und die verwenden? Gruppenoperation auf G ? Sie können jedes Mapping von [ m ] nach G verwenden , aber es ist wünschenswert, dass das Mapping injektiv ist, damit wir die Informationen im Hash-Wert jedes Elements nicht verlieren. Es ist auch wünschenswert, dass die Gruppe nicht kommutativ ist, damit die Hash-Funktion den Unterschied in der Reihenfolge der Elemente in einer Sequenz erfassen kann.

Ich weiß nicht viel über endliche Gruppen, die schnelle Operationen ermöglichen, aber ich vermute, dass solche Gruppen in der Codierungstheorie bekannt sind. Bei Verwendung der symmetrischen Ordnungsgruppe ist mindestens m möglicherweise nicht so schlecht.

Tsuyoshi Ito
quelle
1
Ja, Tillich-Zemor-Hashing verwendet auch Matrixmultiplikation. Was Sie vorschlagen, kann nicht ohne weitere Modifikationen nach Tillich-Zemor funktionieren. Beispielsweise müssen Sie singuläre Matrizen vermeiden, oder Sie erhalten eine Akkumulation bei 0, was die Hash-Statistik ruiniert. Tillich-Zemor arbeitet auf einem Galoisfeld. Eine frühere Version ihres Algorithmus hatte Probleme, weil sie ein generierendes Polynom mit suboptimaler Statistik verwendeten, sodass das jeweilige Galois-Feld sehr wichtig sein kann.
Per Vognsen
@Per: Ich verstehe. Danke für die Erklärung. Was ist dann mit endlichen Gruppen? Ich habe die Antwort darauf geändert.
Tsuyoshi Ito
Genau. Die beste Methode zur Erzeugung unendlicher Gruppenfamilien ist die Verwendung von Matrixgruppen über endlichen Feldern (siehe Klassifikationssatz für endliche einfache Gruppen). Es scheint also, dass Algorithmen dieser Form vom Typ Tillich-Zemor sein werden.
Per Vognsen
@Per: Ich bin mit der Gruppentheorie nicht vertraut und kann nicht verstehen, warum Matrixgruppen über endlichen Feldern in diesem Zusammenhang besser sind als symmetrische Gruppen. Können Sie das näher erläutern?
Tsuyoshi Ito
1
Dafür gibt es mehrere Gründe. Zum einen können Sie in großen symmetrischen Gruppen nicht effizient rechnen, und für die Kollisionsfestigkeit müssen die Gruppen in der Größenordnung von 2 ^ 128 liegen. Im Gegensatz dazu können Sie mit Matrizen über endliche Felder der Charakteristik 2 sehr effizient rechnen, insbesondere wenn Sie ein Polynom mit dünnem Generator auswählen. Es sind nur ein paar kleine Manipulationen.
Per Vognsen
1

Die fast universelle Familie von Hash-Funktionen

{hein(x)=einichxichmodp:einZp}

hat hier eine schöne Eigenschaft: , wobei "" die Verkettung bezeichnet. Wenn Sie an der Wurzel jedes Baums zwischenspeichern, werden sowohl sein Hash-Wert als auchein| x | Sie können den Hash aus der Verkettung von zwei Bäumen in berechnenO(1)Operationen anZp.hein(x)+ein|x|hein(y)=hein(xy)ein|x|Ö(1)Zp

Dies ist sowohl assoziativ als auch ziemlich schnell. Die Kollisionswahrscheinlichkeit von ist O ( min ( | x | , | y | ) / p ) . Siehe CLRS oder Dietzfelbinger et al. In "Polynomial Hash Functions Are Reliable".xyO(min(|x|,|y|)/p)

Apfel
quelle
1

Eine Lösung ist die Verwendung von Merkle-Hashing. Verwenden Sie eine unveränderliche / beständige binäre Baumdatenstruktur. Kommentieren Sie jeden Blattknoten mit dem Hash der Daten, die in diesem Blatt enthalten sind. Kommentieren Sie jeden internen Knoten mit dem Hash der Hashes für die beiden untergeordneten Knoten. Mit anderen Worten, wenn ein interner Knoten mit untergeordneten Knoten n ' , n " ist und diese mit den Hashwerten y ' , y " kommentiert wurden, sollten Sie den internen Knoten n mit dem Hashwert y = H ( y ' , Y' ' ) , wobei Hnn,ny,yny=H(y,y)Hist eine Hash-Funktion. Dies fügt allen Baumoperationen nur zusätzliche Arbeit pro erstelltem Knoten hinzu. Beispielsweise können Sie das Zusammenführen von zwei Bäumen in O ( lg n ) -Zeit unterstützen .O(1)Ö(lgn)

H(x1,,xm)x1,,xmm

DW
quelle