хэш-функция djb2 - PullRequest
       21

хэш-функция djb2

6 голосов
/ 03 апреля 2010

Я использую алгоритм djb2 для генерации хеш-ключа для строки, которая выглядит следующим образом

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

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

    return hash;
}

Теперь с каждым циклом происходит умножение на два больших числа. Через некоторое время с 4-м по 5-й символом строки происходит переполнение, поскольку значение хеша становится огромным

Какой правильный способ рефакторинга, чтобы хеш-значение не переполнялось и хэширование также происходило правильно

Ответы [ 4 ]

19 голосов
/ 03 апреля 2010

Хеш-вычисления часто переполняются. Как правило, это вообще не проблема, если у вас есть гарантии того, что произойдет, когда переполнит . Не забывайте, что смысл хэша не в том, чтобы иметь число, которое означает что-то с точки зрения увеличения и т. Д. - это просто способ определения равенства. Почему переполнение мешает этому?

4 голосов
/ 03 апреля 2010

Я думаю, вы используете статический / динамический анализатор для предупреждения о целочисленных переполнениях? Ну, это один из тех случаев, когда вы можете игнорировать предупреждение. Хеш-функции предназначены для определенных типов свойств, поэтому не беспокойтесь о предупреждениях от вашего анализатора. Только не пытайтесь создать хеш-функцию самостоятельно!

4 голосов
/ 03 апреля 2010

Ты не должен этого делать. Поскольку по модулю нет, целочисленное переполнение является ожидаемым поведением функции (и оно было разработано с учетом этого). Почему вы хотите изменить это?

0 голосов
/ 02 февраля 2012

return (hash & 0xFFFFFFFF); // или любую маску, которую вы хотите, не имеет значения, если вы сохраняете ее согласованной.

...