关于c#:如何为一对3D矢量实现GetHashCode

How to implement GetHashCode for a pair of 3D vectors

本问题已经有最佳答案,请猛点这里访问。

首先,我发现了一个3D整数向量的gethashcode实现,但是我不知道这是不是一个好的实现(至少我不是100%确定):

1
2
3
4
5
6
7
8
9
10
11
public struct Vector3i
{
    public int x;
    public int y;
    public int z;

    public override int GetHashCode ()
    {
        return x.GetHashCode () ^ y.GetHashCode () << 2 ^ z.GetHashCode () >> 2;
    }
}

基于此,我想创建一对3D向量(我们称之为A和B),其散列码独立于向量A和B的顺序。换句话说,我希望对(A,B)的散列码与对(B,A)的散列码相同。我想到了这样的事情:

1
2
3
4
5
6
7
8
9
10
public struct Vector3iPair
{
    public Vector3i a;
    public Vector3i b;

    public override int GetHashCode ()
    {
        return a.GetHashCode () ^ b.GetHashCode ();
    }
}

你认为这会有正确的行为吗?


请参考此答案以正确实现getHashCode(),因为它也适用于您的问题。

对于问题的第二部分,它应该工作得很好,因为位异或(^)是交换的,这意味着无论操作的顺序如何,都会得到相同的结果。

然而,问题出现了,您是要将向量放入散列图中,还是要考虑一些不同的空间散列方法?