我使用djb2算法为一个字符串生成散列键,如下所示
hash(unsigned char *str)
{
unsigned long hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash;
}现在,每次循环都有两个大数字的乘法,经过一段时间后,字符串的第5个字符的第4个字符出现溢出,因为散列值变得很大
什么是重构的正确方法,这样散列值就不会溢出,并且散列也会正确地发生
发布于 2010-04-03 23:38:01
散列计算经常溢出。这通常根本不是问题,只要你能保证当它溢出时会发生什么。别忘了,hash的意义不在于有一个数字,而是一个数字--它只是检测相等性的一种方式。为什么溢出会影响到它呢?
发布于 2010-04-03 23:39:00
你不该那样。由于没有模数,整数溢出是函数的预期行为(它在设计时就考虑到了这一点)。你为什么想要改变它?
发布于 2010-04-04 00:29:42
我在考虑使用静态/运行时分析器来警告整数溢出?这是一种你可以忽略警告的情况。哈希函数是为特定类型的属性设计的,因此不必担心来自分析器的警告。只是不要试图自己创建哈希函数!
https://stackoverflow.com/questions/2571683
复制相似问题