从 double 计算 HashCode

HashCode calculation from double

Effective Java中有一个复杂的例子class。 class 覆盖了使用 hashDouble 方法的 hashCode 我有一个问题。

private int hashDouble(double val) 
{
    long longBits = Double.doubleToLongBits(re);
    return (int) (longBits ^ (longBits >>> 32));
}

它的用途是什么 (int) (longBits ^ (longBits >>> 32))

double值是64位宽,而hash方法返回的int只有32位。 为了实现更好的散列值分布(相对于简单地条带化高32位)。

代码在计算中使用 XOR to incorporate the upper 32 bits (containing sign, exponent and some bits of the mantissa) aligned by right-shifting of the IEEE 754 值。

图片来源维基百科