在我的数据结构类中,我们正在学习不同的哈希函数,但是这个特别是我不明白为什么在代码的最后三行中他们检查HashVal是否为<0,因为因为HashVal是分区的提醒tableSize它永远不应该小于零。我只是想了解最后一部分。先感谢您。
public static int hash(String key, int tableSize)
{
int hashVal = 0;
for( int i = 0; i < key.length(); i++ )
hashVal = 37 * hashVal + key.charAt(i);
hashVal %= tableSize;
if( hashVal < 0 ) //overflow case
hashVal += tableSize;
return hashVal;
}
答案 0 :(得分:3)
int已签名32-bit data type。因此,它可以存储的最大值是2^31-1,它在Integer类中是MAX_VALUE常量。基于negative number representation(左位是符号位),一旦数字大于MAX_VALUE,它将根据该表示变为负数。
答案 1 :(得分:1)
hashVal是一个int,它有一个最大大小。 如果字符串的长度足够长,则hashVal会变得非常大,因为你已经多次将它乘以37,并且它会溢出。 当它溢出时,它可能会变成负数,所以如果hashVal是负数,你需要检查结果。
还有一种已知的解决方法。 变化
for( int i = 0; i < key.length(); i++ )
hashVal = 37 * hashVal + key.charAt(i);
hashVal %= tableSize;
进入
for( int i = 0; i < key.length(); i++ ) {
hashVal = 37 * hashVal + key.charAt(i);
hashVal %= tableSize;
}