Wie kann ich einen eindeutigen Hashcode für eine Zeichenfolge generieren?

8

Gibt es irgendeine Funktion, die mir den gleichen Hashcode für die gleiche Zeichenfolge gibt?

Ich habe Probleme beim Erstellen von 2 verschiedenen Strings (aber mit dem gleichen Inhalt), ihr Hashcode ist anders und wird daher nicht korrekt in Dictionary verwendet.

Ich würde gerne wissen, welche GetHashCode() -Funktion die Dictionary verwendet, wenn der Schlüssel eine Zeichenfolge ist.

Ich baue meins so:

%Vor%

Aber es erzeugt unterschiedliche Ergebnisse für jede Instanz, die diesen Code verwendet, obwohl der Inhalt der Zeichenfolge derselbe ist.

    
RagnaRock 19.01.2012, 11:06
quelle

1 Antwort

13

Ihr Titel fragt nach einer Sache ( einzigartigen Hash-Codes), die Ihr Körper nach etwas anderem ( konsistenten Hash-Codes) fragt.

Sie behaupten:

  

Ich habe Probleme beim Erstellen von zwei verschiedenen Strings (aber mit dem gleichen Inhalt), ihr Hashcode ist anders und wird deshalb in einem Dictionary nicht korrekt verwendet.

Wenn die Strings wirklich denselben Inhalt haben, wird das einfach nicht vorkommen. Deine Diagnose ist irgendwie falsch. Überprüfen Sie, ob in Ihren Zeichenfolgen nicht druckbare Zeichen vorhanden sind, z. B. nachgestellte Unicode- "Null" -Zeichen:

%Vor%

Hier könnten text1 und text2 in einigen Kontexten auf die gleiche Weise drucken, aber ich hoffe, dass sie unterschiedliche Hash-Codes haben.

Beachten Sie, dass Hash-Codes nicht garantiert eindeutig und nicht sein können ... es gibt nur 2 32 mögliche Hash-Codes zurückgegeben von GetHashCode , aber mehr als 2 32 möglichen verschiedenen Strings.

Beachten Sie auch, dass der gleiche Inhalt nicht garantiert denselben Hash-Code in verschiedenen Läufen erzeugt, auch nicht in der gleichen ausführbaren Datei - Sie sollten nicht persistent einen Hash-Code sein irgendwo. Zum Beispiel glaube ich, dass die 32-Bit .NET 4 und 64-Bit .NET 4 CLRs unterschiedliche Hash-Codes für Strings erzeugen. Ihre Behauptung, dass die Werte nicht korrekt in Dictionary gespeichert sind, legt jedoch nahe, dass dies in einem einzigen Prozess geschieht - wobei alles konsistent sein sollte.

Wie in Kommentaren erwähnt, ist es durchaus möglich, dass Sie Equals falsch überschreiben. Ich würde auch vorschlagen, dass Ihr Ansatz zum Erstellen eines Hash-Codes nicht gut ist. Wir wissen nicht, welche Arten von Equipment und Destiny sind, aber ich schlage vor, dass Sie etwas wie:

verwenden sollten %Vor%

Das ist der Ansatz, den ich normalerweise für Hashcodes verwende. Equals würde dann etwa so aussehen:

%Vor%     
Jon Skeet 19.01.2012, 11:15
quelle

Tags und Links