散列函数溢出

时间:2016-03-06 01:08:19

标签: data-structures hash

在我的数据结构类中,我们正在学习不同的哈希函数,但是这个特别是我不明白为什么在代码的最后三行中他们检查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;

}

2 个答案:

答案 0 :(得分:3)

Java中的

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;
}