0

如何确定哈希码值?最近我遇到了一个面试问题,“17 是一个有效的哈希码吗?”。是否有任何机制来定义哈希码值?或者我们可以为哈希码值提供任何数字?

4

3 回答 3

3

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

从那时起,虽然 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++];
}

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

于 2013-02-25T06:54:19.393 回答
0

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

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

于 2013-02-25T06:54:02.487 回答
0

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

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

为实现hascode提供了不同的方法

于 2013-02-25T06:59:03.383 回答