2008-08-19 8 views

Répondre

4

Vous pouvez prendre le code C presque sans changements:

uint sdbm(string str) 
{ 
    uint hash = 0; 
    foreach(char ch in str) 
    { 
     hash = ch + (hash << 6) + (hash << 16) - hash; 
    } 
    return hash; 
} 

Ou pensez-vous de quelque chose de plus sophistiqué?

1

Je n'ai pas un compilateur C mis en place, je ne peux pas tester pour voir si elle effectue la même chose, mais je pense ce qui suit est correcte:

private static ulong SBDM(string str) 
{ 
    ulong hash = 0; 

    foreach (char c in str) 
    { 
     hash = c + (hash << 6) + (hash << 16) - hash; 
    } 

    return hash; 
} 

Si vous avez juste besoin obtenir un hachage de la chaîne et peu importe l'implémentation, vous pouvez toujours faire theString.GetHashCode();

0

Le résultat du hachage diffère entre l'implémentation C++ et C#. J'ai compris que le paramètre str doit être passé en tant que tableau d'octets.

private uint sdbm(byte[] str) 
{ 
    uint hash = 0; 

    foreach (char ch in str) 
     hash = ch + (hash << 6) + (hash << 16) - hash; 

    return hash; 
} 

appeler la méthode en convertissant la valeur à hacher avec la méthode BitConverter.GetBytes.

uint Hash = sdbm(BitConverter.GetBytes(myID));