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 % 8 同2000 % 8 桶1000 % 10 同2000 % 10 桶1000 % 20 同2000 % 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(又称魔鬼打)-不吉利的数字。