3

如何在 C# 中实现sdbm散列函数(例如this )?

4

3 回答 3

3

您几乎可以不加改动地获取 C 代码:

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

还是您想到了更复杂的东西?

于 2008-08-19T10:52:35.800 回答
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;
}

如果您只需要获取字符串的散列并且实现是什么并不重要,您总是可以执行String.GetHashCode();

于 2008-08-19T10:52:49.310 回答
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));
于 2008-08-20T14:34:20.080 回答