use*_*011 117 java boolean hashcode
类Boolean的hashCode()方法实现如下:
public int hashCode() {
return value ? 1231 : 1237;
}
Run Code Online (Sandbox Code Playgroud)
为什么使用1231和1237?为什么不是别的?
aio*_*obe 136
1231和1237只是两个(足够大)的任意素数.任何其他两个大素数都可以.
为什么要素数?
假设我们选择复合数字(非素数),比如1000和2000.当将布尔值插入哈希表时,true和false将进入bucket 1000 % Nresp 2000 % N(其中N是桶的数量).
现在注意到了
1000 % 8 同样的桶 2000 % 81000 % 10 同样的桶 2000 % 101000 % 20 同样的桶 2000 % 20换句话说,它会导致许多碰撞.
这是因为1000(2 3 5 3 3)的因式分解和2000(2 4 5 3 3)的因子分解具有许多共同因素.因此选择素数,因为它们不太可能与桶大小有任何共同因素.
为什么大素数.不会2和3吗?
在计算复合对象的哈希码时,通常会为组件添加哈希码.如果在具有大量存储桶的哈希集中使用太小的值,则存在以不均匀的对象分布结束的风险.
碰撞是否重要?无论如何,布尔有两个不同的价值观?
地图可以包含布尔值以及其他对象.此外,正如Drunix所指出的,创建复合对象的哈希函数的常用方法是重用子组件哈希代码实现,在这种情况下返回大质数是很好的.
相关问题:
小智 6
除了上面所说的之外,它也可以是开发人员提供的一个小复活节彩蛋:
正确:1231 => 1 + 2 + 3 + 1 = 7
7——欧洲传统中的幸运数字;
假:1237 => 1 + 2 + 3 + 7 = 13
13(又名魔鬼打)——不吉利的数字。
| 归档时间: |
|
| 查看次数: |
14775 次 |
| 最近记录: |