2008-08-19 5 views

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));