Как будет реализована хеш-функция sdbm в C#?

Как можно реализовать sdbm хеш-функцию (например, эту ) на C#?

Ответов (3)

Код на 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;
}

Если вам просто нужно получить хэш строки, и не имеет большого значения, какова реализация, вы всегда можете сделать String.GetHashCode() :

Результат хеширования различается в реализациях 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));