How will a sdbm hash function (such as http://www.cse.yorku.ca/~oz/hash.html) be implemented in C# ?
+2
A:
You can take the C code almost without changes:
uint sdbm( string str )
{
uint hash = 0;
foreach( char ch in str )
{
hash = ch + (hash << 6) + (hash << 16) - hash;
}
return hash;
}
Or did you think of something more sophisticated?
Timbo
2008-08-19 10:52:35
A:
I don't have a C compiler set up so I can't test to see if it performs the same, but I think the following is correct:
private static ulong SBDM(string str)
{
ulong hash = 0;
foreach (char c in str)
{
hash = c + (hash << 6) + (hash << 16) - hash;
}
return hash;
}
If you just need to get a hash of the string and it doesn't matter too much what the implementation is you can always do theString.GetHashCode();
ICR
2008-08-19 10:52:49
A:
The result from the hash differs between the C++ and C# implementation. I figured out that str parameter needs to be passed as a byte array.
private uint sdbm(byte[] str)
{
uint hash = 0;
foreach (char ch in str)
hash = ch + (hash << 6) + (hash << 16) - hash;
return hash;
}
Call the method by converting the value to be hashed with the BitConverter.GetBytes method.
uint Hash = sdbm(BitConverter.GetBytes(myID));
Christo
2008-08-20 14:34:20