Java Boolean.hashCode()

Java Boolean.hashCode(),java,boolean,hashcode,Java,Boolean,Hashcode,布尔类的hashCode()方法实现如下: public int hashCode() { return value ? 1231 : 1237; } 为什么使用1231和1237?为什么不是别的呢?1231和1237只是两个(足够大的)任意素数。任何其他两个大素数都可以 为什么使用素数? 假设我们选择了复合数(非素数),比如1000和2000。将布尔值插入哈希表时,true和false将进入bucket1000%Nresp2000%N(其中N是bucket数) 现在注意 1000%

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

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

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

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

为什么使用素数?
假设我们选择了复合数(非素数),比如1000和2000。将布尔值插入哈希表时,true和false将进入bucket
1000%N
resp
2000%N
(其中
N
是bucket数)

现在注意

  • 1000%8
    2000%8
  • 1000%10
    2000%10
  • 1000%20
    2000%20
换句话说,它将导致许多碰撞

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

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

碰撞重要吗?布尔值有两个不同的值?

贴图可以包含布尔值和其他对象。此外,正如Drunix所指出的,创建复合对象的哈希函数的一种常见方法是重用子组件哈希代码实现,在这种情况下,最好返回大素数

相关问题:


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

    为什么使用素数?
    假设我们选择了复合数(非素数),比如1000和2000。将布尔值插入哈希表时,true和false将进入bucket
    1000%N
    resp
    2000%N
    (其中
    N
    是bucket数)

    现在注意

    • 1000%8
      2000%8
    • 1000%10
      2000%10
    • 1000%20
      2000%20
    换句话说,它将导致许多碰撞

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

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

    碰撞重要吗?布尔值有两个不同的值?

    贴图可以包含布尔值和其他对象。此外,正如Drunix所指出的,创建复合对象的哈希函数的一种常见方法是重用子组件哈希代码实现,在这种情况下,最好返回大素数

    相关问题:


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

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

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

    错误:1237=>1+2+3+7=13


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

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

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

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

    错误:1237=>1+2+3+7=13


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

    我想这些数字足够大了。要获得大于1的gcd,您至少需要
    2*1231=2462
    bucket。在这种情况下,碰撞是一个问题吗?有趣的是,考虑到可以放入int中的内容,碰撞并不是真正的“相当大”。我想它们足够大,可以很好地与JDK哈希表一起工作,但仍然足够小,可以最大限度地减少计算成本。是的,它们并没有那么大也让我吃惊。但是你相信较大的素数会带来更高的成本吗?@Thilo在它们发生碰撞之前,你需要1231*1237=1522747个桶的倍数,这是非常大的。我想说,导致桶计数发生碰撞并不是布尔运算的真正问题,但更多的是关于如何获得复合对象的hascode的常见构造,即将组件的hashcode与一些常量相乘并相加。我想这些都足够大了。要获得大于1的gcd,您至少需要
    2*1231=2462
    bucket。在这种情况下,碰撞是一个问题吗?有趣的是,考虑到可以放入int中的内容,碰撞并不是真正的“相当大”。我想它们足够大,可以很好地与JDK哈希表一起工作,但仍然足够小,可以最大限度地减少计算成本。是的,它们并没有那么大也让我吃惊。但是你相信较大的素数会带来更高的成本吗?@Thilo在它们发生碰撞之前,你需要1231*1237=1522747个桶的倍数,这是非常大的。我想说,导致桶计数发生碰撞并不是布尔运算的真正问题,但更常见的构造是如何得到复合对象的hascode,即将组件的hashcode与一些常量相乘并相加