Boolean.hashCode()

2022-08-31 08:29:22

类布尔值的方法实现如下:hashCode()

public int hashCode() {
    return value ? 1231 : 1237;
}

为什么它使用 1231 和 1237?为什么不做点别的呢?


答案 1

1231和1237只是两个(足够大的)任意素数。任何其他两个大素数都可以。

为什么选择素数?
假设我们选择了合数(非素数),比如1000和2000。在哈希表中插入布尔值时,truefalse 将进入存储桶 resp(存储桶的数量在哪里)。1000 % N2000 % NN

现在请注意

  • 1000 % 8与相同的桶2000 % 8
  • 1000 % 10与相同的桶2000 % 10
  • 1000 % 20与相同的桶2000 % 20
  • ....

换句话说,它会导致许多碰撞

这是因为1000的因式分解(23,53)和2000的因式分解(24,53)有这么多共同的因素。因此,选择质数,因为它们不太可能与桶大小有任何共同因素。

为什么选择大素数。2和3不行吗?
计算复合对象的哈希代码时,通常会为组件添加哈希代码。如果在具有大量存储桶的哈希集中使用的值太小,则存在对象分布不均匀的风险。

碰撞重要吗?布尔值只是有两个不同的值吗?
地图可以包含布尔值和其他对象。此外,正如Drunix所指出的那样,创建复合对象的哈希函数的常用方法是重用子组件哈希代码实现,在这种情况下,最好返回大素数。

相关问题:


答案 2

除了上面所说的一切之外,它也可以是开发人员的小复活节彩蛋:

true:1231 => 1 + 2 + 3 + 1 = 7

7 - 是欧洲传统中的幸运数字;

false: 1237 => 1 + 2 + 3 + 7 = 13

13(又名魔鬼的十几个) - 不幸的数字。