如何从三个long生成哈希码

Sam*_*uel 6 java hash-code-uniqueness hashcode

我有一个坐标为键的HashMap.

坐标有3个长度,保持x,y和z坐标.(坐标是并且需要是一个自定义类,坐标需要很长).

现在我希望能够通过以下方式访问例如字段[5,10,4] : hashMap.get(new Coordinate(5, 10, 4)).

我已经实现了equals方法,但这还不够,因为显然我还需要为hashCode提供一个实现.所以我的问题是我如何从三个长度生成一个独特的hashCode?.

附加:使用外部库中的哈希生成器不是选项.

duf*_*ymo 16

Joshua Bloch告诉你如何在他的"Effective Java"的第3章中为你的Coordinate类编写equals和hashCode .

像这样:

public class Coordinate
{
    private long x;
    private long y;
    private long z;

    @Override
    public boolean equals(Object o)
    {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Coordinate that = (Coordinate) o;

        if (x != that.x) return false;
        if (y != that.y) return false;
        if (z != that.z) return false;

        return true;
    }

    @Override
    public int hashCode()
    {
        int result = (int) (x ^ (x >>> 32));
        result = 31 * result + (int) (y ^ (y >>> 32));
        result = 31 * result + (int) (z ^ (z >>> 32));
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)


And*_*gin 5

这是一个老问题,但如果有人碰到它,现在有一个更简单的方法来做到这一点:

@Override 
public int hashCode() {
    return Objects.hash(x, y, z);
}
Run Code Online (Sandbox Code Playgroud)