Ich nehme an, dass Sie dies tun, weil Sie den Wert anderswo speichern und dagegen vergleichen müssen. Daher kann die Antwort von Zach (obwohl sie völlig korrekt ist) Probleme verursachen, da der Vertrag für String.GetHashCode() explizit seinen Änderungsbereich enthält.
Also hier ist eine feste und in anderen Sprachen leicht wiederholbare Version.
Ich nehme an, dass Sie zur Kompilierzeit die Anzahl der verfügbaren Dezimalstellen wissen. Dies basiert auf dem Jenkins One At a Time Hash (wie implementiert und exhaustively tested von Bret Mulvey), als solches hat es ein hervorragendes Lawinenverhalten (eine Änderung von einem Bit in der Eingabe propagiert zu allen Bits der Ausgabe), was etwas bedeutet faul Moduloreduktion in Bits am Ende ist kein schwerwiegender Fehler für die meisten Anwendungen (auch wenn man mit komplexeren Verhalten besser machen könnte)
const int MUST_BE_LESS_THAN = 100000000; // 8 decimal digits
public int GetStableHash(string s)
{
uint hash = 0;
// if you care this can be done much faster with unsafe
// using fixed char* reinterpreted as a byte*
foreach (byte b in System.Text.Encoding.Unicode.GetBytes(s))
{
hash += b;
hash += (hash << 10);
hash ^= (hash >> 6);
}
// final avalanche
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);
// helpfully we only want positive integer < MUST_BE_LESS_THAN
// so simple truncate cast is ok if not perfect
return (int)(hash % MUST_BE_LESS_THAN)
}
Code fehlt ein Semikolon in der letzten Codezeile. Versucht zu bearbeiten, aber SO erfordert 6 Änderungen. –