1

我有一个类有两种方法:getY() 和 getX()(它是一种地图)。
Y 和 X 的域是 [-1000.0, + 1000.0],它们是双精度数。
我写了一个 hashCode() 方法:

@Override
public int hashCode() 
{
    int hash=(int) (getX()/EPSILON);
    hash+= (int) ( (1000.0/EPSILON)*getY() );
    return hash;
}

其中 EPSILON 是允许的最大误差。
但问题是值太高,如果 X=1000.0 和 Y=1000.0 出现溢出。如何编写一个 hashCode() 方法来处理溢出并且在每种情况下仍然能够为两个不同的对象返回两个哈希码?

4

1 回答 1

1

这就是你应该如何为双打做的(见这里):

long t = Double.doubleToLongBits(d);
result = prime * result + (int) (t ^ (t >>> 32));

对于prime使用较小的素数,标准值为 37。

用另一个素数初始化result,不要从零开始。标准是17。

这是来自 Josh Bloch 的 Effective Java。

至于您的直接问题:

您通过忽略它来处理溢出。在哈希码计算中欢迎溢出。

当然,您不能保证每个可能的值都有不同的哈希值。目标是良好的分散性,而不是唯一性。

于 2012-04-29T21:47:10.810 回答