如何在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));