如何在C#中实现sdbm哈希函数?
时间:2020-03-05 18:40:41 来源:igfitidea点击:
如何在C语言中实现sdbm
散列函数(例如此)?
解决方案
回答
我们几乎可以不加改动地使用C代码:
uint sdbm( string str ) { uint hash = 0; foreach( char ch in str ) { hash = ch + (hash << 6) + (hash << 16) - hash; } return hash; }
还是我们认为更复杂的东西?
回答
我没有设置C编译器,所以我无法测试它是否执行相同的功能,但是我认为以下是正确的:
private static ulong SBDM(string str) { ulong hash = 0; foreach (char c in str) { hash = c + (hash << 6) + (hash << 16) - hash; } return hash; }
如果我们只需要获取字符串的哈希值,而对实现的实现并不太重要,则可以始终执行theString.GetHashCode();。
回答
哈希的结果在C ++和Cimplementation之间有所不同。我发现str参数需要作为字节数组传递。
private uint sdbm(byte[] str) { uint hash = 0; foreach (char ch in str) hash = ch + (hash << 6) + (hash << 16) - hash; return hash; }
通过使用BitConverter.GetBytes方法转换要散列的值来调用该方法。
uint Hash = sdbm(BitConverter.GetBytes(myID));