How can a sdbm
hash function (such as this) be implemented in C# ?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
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?
回答2:
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();
回答3:
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));