关于java:Boolean.hashCode()

Boolean.hashCode()

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

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

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


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

为什么是素数?< BR>假设我们选择了复合数(非素数),比如1000和2000。在哈希表中插入booleans时,true和false分别进入bucket 1000 % N2000 % N(其中N是bucket的数目)。

现在注意到

  • 1000 % 82000 % 8
  • 1000 % 102000 % 10
  • 1000 % 202000 % 20

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

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

为什么是大素数?2和3不行吗?< BR>在计算复合对象的哈希代码时,通常要为组件添加哈希代码。如果在具有大量存储桶的哈希集中使用的值太小,则可能导致对象分布不均匀。

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

相关问题:

  • 为什么在hashcode中使用质数?
  • 什么是哈希代码计算的合理素数?
  • 为什么Java的HASCODE()在字符串中使用31作为乘法器?


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

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

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

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

13(又称魔鬼打)-不吉利的数字。