C# 如何为一对3D向量实现GetHashCode

C# 如何为一对3D向量实现GetHashCode,c#,vector,hashcode,gethashcode,key-pair,C#,Vector,Hashcode,Gethashcode,Key Pair,首先,我找到了一个3D整数向量的GetHashCode实现,但我不知道这是不是一个好的实现(至少我不是100%确定): 您认为这会有正确的行为吗?请参考GetHashCode()的正确实现,因为它也适合您的问题 至于问题的第二部分,它应该可以正常工作,因为按位异或(^)是可交换的,这意味着无论操作顺序如何,都会得到相同的结果 然而,问题出现了,你只是想把你的向量放到散列图中,还是想用一些不同的空间散列方法?你是否也会覆盖Equals以便新向量3ipair(a,b)==新向量3ipair(b,a)

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

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

请参考GetHashCode()的正确实现,因为它也适合您的问题

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


然而,问题出现了,你只是想把你的向量放到散列图中,还是想用一些不同的空间散列方法?

你是否也会覆盖Equals以便
新向量3ipair(a,b)==新向量3ipair(b,a)
?谢谢Alex,这是我需要的答案。我希望向量对是可交换的(关于hashcode),因为我需要能够存储和检索发生在A和B之间的东西,而不管它们的顺序如何。更具体地说,我有一种在两个给定点之间创建顶点的方法,我不想复制顶点,因此如果两点之间已经存在顶点,我必须能够快速检索它。我建议使用加法而不是xor,或者将散列码x和y与类似
(x^y^((x+y)*251)的内容相结合
。对于一个简单的基于异或的散列,所有向量对{(a,b,c),(a,b+1,c)}的一半将产生1的散列码值。不好的。使用上述方法将使哈希值依赖于所有值。
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;
    }
}
public struct Vector3iPair
{
    public Vector3i a;
    public Vector3i b;

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