Как вы хэшируете строку?Мне нужно, чтобы случайные строки как-то превратились в целые числа, чтобы поместить их в мою хэш-таблицу - PullRequest
0 голосов
/ 12 ноября 2011

Например, «foobar» должен хешировать что-то вроде 3456. Мой массив хеш-таблиц имеет размер 811, поэтому моя хеш-функция сделает 3456% 811, чтобы найти позицию в хеш-таблице для размещения «foobar».

Есть предложения?

Ответы [ 3 ]

3 голосов
/ 12 ноября 2011

Я предлагаю djb2 из Хеш-функции

djb2

этот алгоритм (k = 33) был впервые представлен Даном Бернштейноммного лет назад в comp.lang.c.другая версия этого алгоритма (теперь одобренная Бернштейном) использует xor: hash(i) = hash(i - 1) * 33 ^ str[i];магия числа 33 (почему она работает лучше, чем многие другие константы, простые или нет) никогда не была адекватно объяснена.

unsigned long hash(unsigned char *str)
{
    unsigned long hash = 5381;
    int c;

    while (c = *str++)
        hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

    return hash;
}

Также представляет интерес

реализация lose lose из цитируемой оригинальной книги K & R.Хороший пример как не для хэширования вашей строки.

0 голосов
/ 13 ноября 2011

Boost Funcional / Hash

http://www.boost.org/doc/libs/1_47_0/doc/html/hash/tutorial.html

#include <boost/functional/hash.hpp>

int main()
{
    boost::hash<std::string> string_hash;

    std::size_t h = string_hash("Hash me");

    size_t table_index = h % 811;
}
0 голосов
/ 12 ноября 2011

Вы можете использовать функцию build it stdlib:

#include <stdlib.h>
i = atoi(char *);

Возвращает целочисленное значение этой строки.

...