Boolean.hashCode()
类布尔值的方法实现如下:hashCode()
public int hashCode() {
return value ? 1231 : 1237;
}
为什么它使用 1231 和 1237?为什么不做点别的呢?
类布尔值的方法实现如下:hashCode()
public int hashCode() {
return value ? 1231 : 1237;
}
为什么它使用 1231 和 1237?为什么不做点别的呢?
1231和1237只是两个(足够大的)任意素数。任何其他两个大素数都可以。
为什么选择素数?
假设我们选择了合数(非素数),比如1000和2000。在哈希表中插入布尔值时,true 和 false 将进入存储桶 resp(存储桶的数量在哪里)。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(又名魔鬼的十几个) - 不幸的数字。