我有一个家庭作业,我必须为字典创建一个哈希表,用户可以输入一个单词作为键,它将搜索并显示其含义。
但是我不确定从String键到int键的转换是如何工作的。这是我从教科书中获取的代码:
public int hashVal(String key, int tableSize)
{
int hashKey= 0;
int temp = 0;
for(int i=0;i<key.length();i++)
{
temp = 37*temp+(int)key.charAt(i);
}
temp%=tableSize;
if (temp<0)
{
temp+=tableSize;
}
hashKey=temp;
return hashKey;
}
非常感谢解释或更简单的代码。
答案 0 :(得分:0)
字符串散列(或任何一般对象)的基本思想是使用输入的所有部分,以便我们获得相当随机和分布的值。
因此,对于字符串,我们使用字符串中的所有字符来计算哈希值。 类似地,对于对象,建议在计算哈希值时使用对象中的所有重要字段。
Java,类似地使用了教科书代码的变体。
问题:为什么你的教科书使用37? [Java类似地使用教科书代码的变体,31为常数值]
答案:使用素数显然可以在整个表格中更好地分配哈希值。
答案 1 :(得分:0)
您的代码有几个冗余。您的哈希计算 - 虽然不一定不正确 - 也是非标准的。我不确定它是否会产生良好的分布,我认为答案是否定的。
我建议进行两次修订:使用37 * (int)key.charAt(i) + hash
,并删除临时变量。
这就变成了:
public static int hashVal(String s, int max) {
int hash = 0;
for(Char c : s.toCharArray())
hash = Math.abs((hash + 37*(int)c) % max);
return hash;
}