Boolean.hashCode()

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

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

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

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

为什么是素数?
假设我们select了复合数字(non-primes),比如说1000和2000.当插入布尔值到哈希表中时, truefalse会进入桶1000 % N resp 2000 % N (其中N是桶的数量)。

现在注意到

  • 1000 % 8同斗2000 % 8
  • 1000 % 102000 % 10相同的斗2000 % 10
  • 1000 % 20 2000 % 20
  • ….

换句话说,会导致很多的碰撞

这是因为1000(2,3,5 3 )的因式分解和2000(2 4,5 3 )的因式分解有许多共同的因素。 因此素数被选中,因为它们不可能与桶大小有任何共同的因素。

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

碰撞是否重要? 布尔有两个不同的值呢?
地图可以包含与其他对象一起的布尔值。 另外,正如Drunix所指出的,创build组合对象的散列函数的常用方法是重用子组件哈希代码实现,在这种情况下,返回大的质数是很好的。

相关问题:

  • 为什么在hashCode中使用素数?
  • 哈希码计算的明智之处是什么?
  • 为什么String中的hashCode()使用31作为乘数?