Wie kann eine Hash-Funktion sdbm
(wie this) in C# implementiert werden?Wie würde eine sdbm-Hash-Funktion in C# implementiert werden?
3
A
Antwort
4
Sie können den C-Code nehmen fast ohne Änderungen:
uint sdbm(string str)
{
uint hash = 0;
foreach(char ch in str)
{
hash = ch + (hash << 6) + (hash << 16) - hash;
}
return hash;
}
Oder haben Sie gedacht, etwas anspruchsvollere?
1
ich einrichten nicht ein C-Compiler haben, so kann ich nicht testen, ob es das gleiche führt, aber ich denke, die folgende ist richtig:
private static ulong SBDM(string str)
{
ulong hash = 0;
foreach (char c in str)
{
hash = c + (hash << 6) + (hash << 16) - hash;
}
return hash;
}
Wenn Sie gerade brauchen Holen Sie sich einen Hash der Zeichenfolge und es spielt keine Rolle, was die Implementierung ist, können Sie immer theString.GetHashCode();
0
Das Ergebnis aus dem Hash unterscheidet zwischen der C++ - und C# -Implementierung. Ich habe herausgefunden, dass der str-Parameter als Byte-Array übergeben werden muss.
private uint sdbm(byte[] str)
{
uint hash = 0;
foreach (char ch in str)
hash = ch + (hash << 6) + (hash << 16) - hash;
return hash;
}
Anruf das Verfahren durch den Wert mit der Umwandlung BitConverter.GetBytes Verfahren werden gehasht.
uint Hash = sdbm(BitConverter.GetBytes(myID));