How would a sdbm hash function be implemented in C

2019-07-01 15:30发布

问题:

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));


标签: c# hash