'Morgen,
ich habe folgenden Code (.NET 6), bitte auf Debatten über den Nutzwert zu verzichten:
string text = "Hallo";
Console.WriteLine($"{text}: {text.GetHashCode()}");
Aufruf 1:
Hallo: -498394817
Aufruf 2:
Hallo: -1111031154
Aufruf 3:
Hallo: 422895921
Müsste der Hashcode nicht immer gleich bleiben oder habe ich da was grundlegendes nicht verstanden?
Gruß Tommix
Hallo,
das was du brauchst findest du hier: https://learn.microsoft.com/de-de/dotnet/api/system.security.cryptography?view=net-6.0
Grüße
Hallo Tommix,
der HashCode ist kein kryptografischer Hash des Strings (gilt für Object im Allgemeinen), sondern nur eine Art "Fingerabdruck" für den aktuellen Prozess, so dass Vergleiche und v.a. Hash-basierte Datentypen (wie Dictionary, HashSet) mit O(1)-Operationen umgesetzt werden können.
Bei int
ist der HashCode trivial implementiert, nämlich der Wert einfach selbst.
Da GetHashCode
als Rückgabetype int
verwendet gibt es folglich auch nur soviele verschiedene HashCodes wie eben mit int
abgebildet werden können (2^32 = 4.294.967.296). Also eine begrenzte Menge und das Schubfachprinzip findet Anwendung, kurz es wird Kollisionen (= gleicher HashCode) geben.
Strings sind wohl einer am häufigst verwendeten Datentypen. Web-Server und Authentifizierungserver sind hierbei keine Aussnahme.
Würde für jeden Programmablauf für den gleichen String immer der gleiche HashCode ermittelt werden, so öffnet das die Tür für Angriffe* da ein bestimmter String eine deterministische Ausgabe (hier HashCode) liefert.
Aus diesem Grund verwendet .NET seit einiger Zeit (ich glaube .NET Core 2.1, habs nicht nachgeschaut) einen zufälligen "Startwert" für String-Hashes. D.h. innerhalb eines Programmablaufs ist das Resultat von GetHashCode für gleiche Eingaben deterministisch (sonst wäre es ja unsinnig), aber für jeden Programmablauf eben anders um solche Angriiffe zu erschweren.
Wie eingangs bereits angedeutet sollte der Wert von GetHashCode ohnehin nicht von Bedeutung sein und v.a. nicht explizit verwendet werden, denn dazu ist GetHashCode nicht gedacht. Betrachte den Wert von GetHashCode als Implementierungsdetail, das für Dictionary, HashSet, EqualityComparer, etc. verwendet wird ohne dass du dich für den tatsächlichen Wert interessierst**.
* auf dem Gebiet kenn ich mich zu wenig aus um konkrete Beispiel liefern zu können.
** außer du entwickelst eine eigene Methode für GetHashCode von eigenen Typen um so eine möglichst gleichmäßige Verteiliung ohne zuviele Kollisionen zu erhalten
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Alles klar, Danke.