2008-08-19 119 views

回答

4

你几乎可以把C代码无需改动:

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

或者你想到的东西更复杂?

1

我没有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();

0

来自散列的结果在C++和C#实现之间有所不同。我想出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));