2017-10-24 7 views
-1

ich ein Programm erstellt habe einen Benutzer nehmen vorbestimmte eindeutige Kennung, Hash es, und speichern sie in einem Wörterbuch-Mapping auf den Namen des Benutzers. Ich erhalte später die eindeutige Kennung, rehash und kann den Namen des Benutzers nachschlagen.Umgang mit Python-Hash() Kollision

Ich habe ein Problem kommen, wo ein 9-stellige eindeutiger ID-Hash des Individuums() 's auf die gleiche Anzahl wie jemand anderes. Dies ist nach dem Sammeln von Daten für ungefähr 40 Benutzer aufgetreten.

Gibt es eine gemeinsame Arbeit um dies zu tun? Ich glaube, das ist anders als nur eine Hashmap, denn wenn ich einen Bucket für die Hash-ID erstelle, kann ich nicht sagen, wer der Benutzer war (ob es das erste Element im Bucket oder die Sekunde ist).

Edit:

id = raw_input() 
hashed_id = hash(id) 
if not dictionary.has_key(hashed_id): 
    name = raw_input() 
    dictionary[hashed_id] = name 
check_in_user(dictionary[hashed_id]) 
+1

Deshalb Wörterbücher und Sätze Sie benötigen sowohl '__hash__' umzusetzen ** und **' __eq__', so kann es doppelte Kontrolle im Falle einer Kollision. Ohne eine [mcve] ist es schwierig, spezifisch vorzuschlagen, was (wenn überhaupt) Sie ändern müssen. – jonrsharpe

+1

Was ist, wenn Sie den eindeutigen Bezeichner als Schlüssel im Wörterbuch anstelle des Hashs des eindeutigen Bezeichners verwendet haben? Da die Kennung eindeutig ist, sollten Sie keine Kollisionen haben. – Kevin

+1

Ihr Missfortune (oder Glück) ist wahrscheinlich von göttlichen Proportionen .. Aber wie die anderen Benutzer sagten, was Sie tun sollten, ist die Überprüfung des ** Hashwert eingegeben ** gegen den ** Hash-Wert gespeichert ** für die ** insbesondere Benutzer**; nicht alle Benutzer. –

Antwort

0

Ich habe noch nie hash() dafür verwendet gesehen. sollte für Datenstrukturen als Abkürzung für das gesamte Objekt verwendet werden, z. B. Schlüssel in der internen Implementierung von Wörterbüchern.

Ich würde vorschlagen, anstatt eine UUID (Universal Unique Identifier) ​​für die Benutzer verwenden.

import uuid 
uuid.uuid4() 
# UUID('d36b850c-2433-42c6-9252-6371ea3d33c2') 

Sie werden very hard pressed sein, um eine Kollision von UUIDs zu bekommen. Diese