Хеш-функция djb2

Я использую 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-го символа строки существует переполнение, поскольку значение хэш-функции становится огромным

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

6
задан Lukáš Lalinský 3 April 2010 в 15:35
поделиться

3 ответа

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

4
ответ дан 8 December 2019 в 03:26
поделиться

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

20
ответ дан 8 December 2019 в 03:26
поделиться

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

4
ответ дан 8 December 2019 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: