这是C. Horstmann的Core Java摘录。 +++++ hashCode方法应该返回一个整数(可以是负数)。只是结合起来 实例字段的哈希码,以便不同对象的哈希码可能 广泛分散。 例如,这是Employee类的hashCode方法:
class Employee
{
public int hashCode()
{
return 7 * name.hashCode() + 11 * new Double(salary).hashCode() + 13 * hireDay.hashCode();
}
. . .
}
+++
我无法理解这些7,11和13.他们刚从帽子里拔出来了吗?没有它们,结果(检查两个对象的相等性)似乎是一样的。
答案 0 :(得分:3)
通常,测试相等性不会使用哈希码。
7,11,13都是素数。这降低了两个不同员工具有相同哈希码的可能性(因为theorem of Bézout)。
事实上,我建议(扩大获得的哈希)使用更大但非连续的素数,例如1039,2011,32029。在Linux上,来自包/usr/games/primes
的{{1}}实用程序非常有用。
重要的是,如果两个比较相等,则它们具有相同的哈希码。 出于性能原因,您希望散列代码被广泛分布(因此,如果两个东西不相等,它们的哈希码通常应该不同),以降低hash collision的概率。
在hash tables上阅读wikipage。
答案 1 :(得分:2)
这些数字是素数。
你不想只是添加哈希码,因为它会让你有更多的冲突。
e.g。
情况A:foo =" bla",bar =" 111"
情况B:foo =" 111",bar =" bla"
这意味着foo.hash() + bar.hash()
将在两种情况下返回相同的值。你使用素数,因为函数f:N / 2 ^ 32 - > N / 2 ^ 32:x - >如果p是素数,则x * p(mod 2 ^ 32)是双射的。 2.(如果乘以256而你会丢失比特......)
答案 2 :(得分:0)
与素数相乘是一种常见的优化,通常由IDE为您完成。如果不需要优化,我就不会这样做。