Java Hash表键。将String键转换为int键

时间:2013-04-14 17:18:10

标签: java hashtable

我有一个家庭作业,我必须为字典创建一个哈希表,用户可以输入一个单词作为键,它将搜索并显示其含义。

但是我不确定从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;
}

非常感谢解释或更简单的代码。

2 个答案:

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