如何确定哈希码值?

时间:2013-02-25 06:50:21

标签: java collections hashcode

如何确定哈希码值?最近我面临一个采访问题“17是一个有效的哈希码?”。是否有任何机制来定义哈希码值?或者我们可以给哈希码值任意数字?

3 个答案:

答案 0 :(得分:3)

Hashcodes应具有良好的分散性,以便将不同的对象保存在哈希表的不同位置(否则性能可能会降低)。

从那时起,虽然17 us是一个“有效”哈希码(在某种意义上它是一个32位有符号整数),但是如何定义哈希函数是可疑的。

例如,用于散列字符串的简单方法只是添加每个字符的值。这导致简单字符串的类似哈希值(例如“tar”和“rat”总和达到相同的值)。

一个常见的技巧是将每个值乘以一个小素数,这样简单的输入就会返回不同的值,例如;

int result = 1;
result = 31 * result + a;
result = 31 * result + b;

int h=0;
for (int i = 0; i < len; i++) {
    h = 31*h + val[off++];
}

(后者,来自String.hashCode的JRE实施)

答案 1 :(得分:0)

是的,17是完全有效的哈希码。

无论您选择哪种方法来派生哈希码,它都应该始终为对象返回相同的整数(只要其状态保持不变)。

答案 2 :(得分:0)

Ya 17有效。通常使用链接中显示的素数,您可以使用该主体的id作为主键来实现哈希码

public int hashCode()
{
    int result = 17;
    result = 37 * result + (getId() == null ? 0 : this.getId().hashCode());
    return result;
}

这提供了different ways for implementing the hascode