次のような文字列のハッシュキーを生成するためにdjb2アルゴリズムを使用しています
hash(unsigned char *str)
{
unsigned long hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash;
}
これで、すべてのループで 2 つの大きな数の乗算が行われます。しばらくすると、文字列の 5 番目の文字の 4 番目の文字で、ハッシュ値が巨大になるため、オーバーフローが発生します。
ハッシュ値がオーバーフローせず、ハッシュも正しく行われるようにリファクタリングする正しい方法は何ですか?