C# 如何为此类编写哈希代码生成器?

C# 如何为此类编写哈希代码生成器?,c#,hash,C#,Hash,我有一个类在三个浮动中占有一个位置。我已经推翻了这样的平等: return Math.Abs(this.X - that.X) < TOLERANCE && Math.Abs(this.Y - that.Y) < TOLERANCE && Math.Abs(this.Z - that.Z) < TOLERANCE; 返回Math.Abs(this.X-that.X)

我有一个类在三个浮动中占有一个位置。我已经推翻了这样的平等:

return Math.Abs(this.X - that.X) < TOLERANCE
    && Math.Abs(this.Y - that.Y) < TOLERANCE
    && Math.Abs(this.Z - that.Z) < TOLERANCE;
返回Math.Abs(this.X-that.X)
这一切都很好,但现在我需要为这些顶点编写一个GetHashCode实现,我被卡住了。简单地获取三个值的hashcode并将它们异或在一起是不够的,因为位置稍有不同的两个对象可能被认为是相同的

那么,如何为这个类构建一个GetHashCode实现,它将始终为上述方法认为相等的实例返回相同的值呢?

这个“Equals”实现不满足相等的传递属性(如果X等于Y,Y等于Z,那么X等于Z)


考虑到您已经得到了一个不一致的Equals实现,我不会太担心您的哈希代码。

我建议您重新考虑
Equals的实现。它违反了传递属性,这会让你头疼。请参见,特别是这一行:

如果(x等于(y)&&y等于(z)) 返回true,然后x.Equals(z)返回 对。这被称为及物动词 财产


这可能吗?在相等实现中,实际上存在一个滑动窗口,在该窗口内相等被认为是真实的,但是如果您必须对哈希进行“bucketize”(或量化),那么很可能两个“相等”的项位于哈希“边界”的任一侧

假设您有这些对象(箭头表示公差的限制,我将其简化为一维):

(这就是所提到的及物性丧失…)

然而。因此,我们:

a.Equals(b) == true
b.Equals(c) == true

a.Equals(c) == false
hash(a) = hash(b)
hash(b) = hash(c)

∴ hash(a) = hash(c)
通过扩展,我们可以用它覆盖一维空间的任何部分(想象一下
D
e
f
,…),所有的散列都必须是相同的

int GetHashCode()
{
    return some_constant_integer;
}
我想说的是,不要为.NET的
GetHashCode
而烦恼。这对您的应用程序没有意义。;)


如果您需要某种形式的散列来快速查找数据类型,您应该开始寻找某种形式的。

感谢那些指出equals不可传递的家伙。我应该看到的!我会接受这个,因为它确实回答了这个问题(尽管这个问题问得很糟糕)
int GetHashCode()
{
    return some_constant_integer;
}