2017-09-19 1 views
0

Ich suche Ratschläge für das Finden oder Erstellen eines Hash-Algorithmus für .Net C#.Wie erstelle ich einen garantierten eindeutigen Hash über eine Sammlung von eindeutigen Strings in .Net?

Ich habe eine Sammlung von Spalten aus einer DB. Die Kombination von Spalten über die Tabelle wird garantiert eindeutige Strings produzieren.

Bedenken Sie:

String Column1 = "StringA"; 
String Column2 = "StringB"; 
String Column3 = "StringC"; 

ich die Spalten in einem einzigen String verketten:

String ColumnKey = Column1 + Column2 + Column3; 

Derzeit errichtet in .Net C# Hash-Funktion aus der String-Klasse ich verwende.

Nachdem ich etwas gelesen habe, verstehe ich, dass (obwohl die Wahrscheinlichkeit ziemlich niedrig ist) dieser Algorithmus keine Eindeutigkeit garantiert. Es ist auch mein Verständnis, dass diese Funktion unterschiedliche Ergebnisse für die gleiche Zeichenkette über verschiedene Versionen des .Net-Frameworks erzeugen kann.

Ich bin auf der Suche nach einem anderen Hash-Algorithmus zu verwenden, die Eindeutigkeit garantieren und konsistente Ergebnisse über verschiedene Versionen von .Net produzieren würde.

Kann mir jemand helfen, mich in die richtige Richtung zu bringen?

+2

Sie können nicht. Sie können einfach keine mögliche Zeichenfolge in eine 32-Bit-Ganzzahl laden und die Eindeutigkeit garantieren. – itsme86

+1

Verwenden Sie einen der Standard-SHA-Algorithmen. Aber 32 Bits sind zu niedrig für einen Hash, wenn Sie sich Sorgen um die Einzigartigkeit machen. Kein Hash wird die Eindeutigkeit garantieren, aber SHA256 zum Beispiel macht die Wahrscheinlichkeit einer Kollision so gering, dass Sie nicht einmal darüber nachdenken sollten. Dies ist ein gutes Buch, wenn Sie darüber nachdenken möchten: https://stackoverflow.com/questions/4014090/is-it-safe-to-ignore-the-possibility-of-sha-collisions-in-practice –

+1

Die Wahrscheinlichkeit von Kollisionen für einen Strings-Hash-Code ist nicht einmal niedrig. Wenn Sie nur ein paar Zehntausende von Datensätzen haben, haben Sie eine Wahrscheinlichkeit von mehreren Prozent, eine Kollision zu haben, und das setzt voraus, dass die Strings gut verteilt sind, basierend auf dem Hash-Algorithmus. – Servy

Antwort

4

Es ist unmöglich. Es gibt 2^32 verschiedene Werte für einen int, und eine Zeichenfolge, die nur wenige Zeichen lang ist, hat mehr mögliche Werte als diese. Daher kann kein Hashalgorithmus einen eindeutigen Wert für jede Zeichenfolge garantieren.

Siehe das PigeonHole-Prinzip. https://en.wikipedia.org/wiki/Pigeonhole_principle.

Wenn Sie einen garantierten Hash für jede Version von .Net wünschen, implementieren Sie den Hash selbst. A fast hash function for string in C# gibt ein paar Beispiele. Ich würde es in eine Erweiterungsmethode für Zeichenfolge einfügen.

+0

Danke für alle schnellen Antworten. – JohnB

+0

Kein Problem. Froh, dass ich Helfen kann :-) –

1

Es gibt keinen "garantierten eindeutigen Hash". Hashes haben eine Größe (in .NET 32-Bit), so dass es nur 4-Milliarden-Hashes gibt. Haben Sie mehr Strings als das und Sie haben, um eine Kollision zu haben.

Also was Sie fragen, ist nicht möglich.

Verwandte Themen