Boolean类的hashCode()方法的实现如下:
public int hashCode() {
return value ? 1231 : 1237;
}
为什么要使用1231和1237?为什么不使用其他数字?
1231和1237只是两个(足够大的)任意质数。其他任意两个大质数也可以。
为什么选择质数?
想象一下,如果我们选择合数(非质数),比如1000和2000。当将布尔值插入哈希表时,true和false会分别进入桶1000 % N和2000 % N(其中N是桶数量)。
现在注意到:
1000 % 8与2000 % 8进入相同的桶1000 % 10与2000 % 10进入相同的桶1000 % 20与2000 % 20进入相同的桶换句话说,这会导致许多冲突。
这是因为1000(23,53)的因式分解和2000(24,53)的因式分解有很多公共因子。因此选择质数,因为它们不太可能与桶大小有任何公共因子。
为什么选择大的质数?2和3不行吗?
当为复合对象计算哈希码时,常常将组件的哈希码相加。如果在具有大量桶的哈希集中使用过小的值,则有可能导致对象分布不均匀。
冲突是否重要? 布尔值只有两个不同的值?
映射可以包含布尔值和其他对象。另外,正如Drunix所指出的,创建复合对象的哈希函数的常见方法是重用子组件哈希代码实现,在这种情况下,最好返回较大的质数。
相关问题:
true: 1231 => 1 + 2 + 3 + 1 = 7
7 - 在欧洲传统中是幸运数字;
false: 1237 => 1 + 2 + 3 + 7 = 13
13(又称魔鬼十三)- 是个不吉利的数字。