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

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

19.08.2008 10:33:21
3 ОТВЕТА

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

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

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

3
19.08.2008 10:52:35

У меня не установлен компилятор 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();

1
27.11.2019 02:04:40

Результат из хэша отличается между реализацией 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));
0
27.11.2019 02:05:00