Как будет реализована хеш-функция sdbm в C #? - PullRequest
3 голосов
/ 19 августа 2008

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

Ответы [ 3 ]

3 голосов
/ 19 августа 2008

Вы можете взять код C практически без изменений:

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

Или ты думал о чем-то более сложном?

1 голос
/ 19 августа 2008

У меня не настроен компилятор 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 голосов
/ 20 августа 2008

Результат из хэша отличается в реализациях 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...