Reputation: 39
How can a sdbm
hash function (such as this) be implemented in C# ?
Upvotes: 3
Views: 4735
Reputation: 39
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));
Upvotes: 0
Reputation: 14162
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 the String.GetHashCode()
;
Upvotes: 1
Reputation: 28050
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?
Upvotes: 3