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(),因为它也适用于您的问题。
对于问题的第二部分,它应该工作得很好,因为位异或(^)是交换的,这意味着无论操作的顺序如何,都会得到相同的结果。
然而,问题出现了,您是要将向量放入散列图中,还是要考虑一些不同的空间散列方法?