Hashing verschiedene Tupel in Python geben identische Ergebnisse

8

Ich arbeite mit Mengen von Ganzzahl-Matrizen, und ich dachte, sie als Tupel darzustellen, die Sinn ergeben, da sie hashbar sind. Die Funktion hash () hat mir jedoch seltsame Ergebnisse für Tupel gebracht:

%Vor%

Wie Sie sehen, haben diese zwei verschiedenen Tupel denselben Hash-Wert. Beachten Sie, dass sie tatsächlich ziemlich ähnlich sind (Austausch der ersten und letzten Untereinheiten), jedoch konnte ich kein minimaleres Beispiel finden: ((0,1),(0,0)) und ((0,0),(0,1)) haben beispielsweise unterschiedliche Hash-Werte.

Irgendwelche Hinweise darauf, was vor sich geht? Ich kann nicht glauben, dass es nur unglaublich schlechtes Glück ist ... Jetzt, wo ich das Problem gefunden habe, konnte ich es leicht umgehen, aber ich dachte, es wäre trotzdem erwähnenswert.

    
pierre 10.09.2015, 14:41
quelle

2 Antworten

9

Der Hash eines Tupels basiert auf den Hashes des Inhalts mit der folgenden Formel (aus dem tuplehash() funktion ):

%Vor%

Zufällig erzeugt diese Formel genau die gleiche Ausgabe für (1, 0, -1) und (1, -1, 0) :

%Vor%

, weil die Hashwerte für die drei enthaltenen Ganzzahlen 1 , 0 und -2 :

sind %Vor%

und das Tauschen von 0 und -2 hat keinen tatsächlichen Einfluss auf das Ergebnis.

Also ändern sich die Hashes für die drei enthaltenen Tupel nicht zwischen den beiden Beispielen, also ändert sich auch der endgültige Hashwert nicht.

Dies ist nur ein Zufall, in der Praxis passiert das nicht alles das oft und Wörterbücher und Sätze können bereits Kollisionen gut behandeln.

    
Martijn Pieters 10.09.2015, 14:49
quelle
-1

Scheint seltsam, aber verwenden Sie hash nicht: Ссылка

  

[hash] wird verwendet, um während einer Wörterbuchsuche die Wörterbuchschlüssel schnell zu vergleichen.

Es ist nicht wirklich für Hashes für allgemeine Zwecke gedacht - Wörterbücher haben zusätzliche Prüfungen, die über die einfache Hash-Gleichheit hinausgehen. Verwenden Sie zum allgemeinen Hashing hashlib

    
dave mankoff 10.09.2015 14:49
quelle

Tags und Links