HashCode()

类 Boolean 的 hashCode()方法是这样实现的:

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

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

17436 次浏览

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

为什么是质数?
假设我们选择了复合数字(非素数) ,比如1000和2000。当向散列表中插入布尔值时,没错假的将进入 bucket 1000 % N rep 2000 % N(其中 N是桶的数量)。

现在注意到了

  • 2000 % 8一样的桶
  • 2000 % 10一样的桶
  • 2000 % 20一样的桶
  • ....

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

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

为什么是 很大质数,难道2和3不行吗?
当计算组合对象的哈希代码时,通常会为组件添加哈希代码。如果在具有大量桶的散列集中使用的值太小,那么就有可能导致对象分布不均匀。

碰撞重要吗? 布尔值只有两个不同的值?
映射可以与其他对象一起包含布尔值。另外,正如 Drunix 所指出的,创建复合对象的 hash 函数的一种常见方法是重用子组件 hash 代码实现,在这种情况下,最好返回大的素数。

相关问题:

除了上面所说的,它还可以是开发商送来的一个小复活节彩蛋:

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

7-在欧洲传统中是一个幸运数字;

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

13(又名魔鬼十二)-不吉利的数字。