Boolean.hashCode()
类Boolean的hashCode()方法是这样实现的:
public int hashCode() { return value ? 1231 : 1237; }
为什么使用1231和1237? 为什么不是别的?
1231和1237只是两个(足够大)的任意素数 。 任何其他两个大素数都可以。
为什么是素数?
假设我们select了复合数字(non-primes),比如说1000和2000.当插入布尔值到哈希表中时, true和false会进入桶1000 % N
resp 2000 % N
(其中N
是桶的数量)。
现在注意到
-
1000 % 8
同斗2000 % 8
-
1000 % 10
与2000 % 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作为乘数?