Я использую 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-го символа строки существует переполнение, поскольку значение хэш-функции становится огромным
Что является корректным способом осуществить рефакторинг так, чтобы значение хэш-функции не переполнялось, и хеширование также происходит правильно
Не надо этого делать. Поскольку модулю нет, целочисленное переполнение является ожидаемым поведением функции (и оно было разработано с учетом этого). Почему вы хотите это изменить?
Расчеты хэша часто переполняются. Обычно это не проблема, если у вас есть гарантии того, что произойдет, когда произойдет переполнение . Не забывайте, что суть хэша не в том, чтобы иметь число, которое что-то означает с точки зрения величины и т. Д. - это просто способ определения равенства. Почему этому мешает переполнение?
Я думаю, вы используете статический анализатор / анализатор времени выполнения, чтобы предупреждать о переполнении целых чисел? Что ж, это один из тех случаев, когда вы можете игнорировать предупреждение. Хеш-функции предназначены для определенных типов свойств, поэтому не беспокойтесь о предупреждениях вашего анализатора. Только не пытайтесь создать хеш-функцию самостоятельно!