我的理解是,您通常应该将 xor 与 GetHashCode() 一起使用来生成 int,以通过其值(而不是通过其引用)来识别数据。这是一个简单的例子:
class Foo
{
int m_a;
int m_b;
public int A
{
get { return m_a; }
set { m_a = value; }
}
public int B
{
get { return m_b; }
set { m_b = value; }
}
public Foo(int a, int b)
{
m_a = a;
m_b = b;
}
public override int GetHashCode()
{
return A ^ B;
}
public override bool Equals(object obj)
{
return this.GetHashCode() == obj.GetHashCode();
}
}
我的想法是,我想根据属性 A 和 B 的值将 Foo 的一个实例与另一个实例进行比较。如果 Foo1.A == Foo2.A 且 Foo1.B == Foo2.B,那么我们就相等。
问题是这样的:
Foo one = new Foo(1, 2);
Foo two = new Foo(2, 1);
if (one.Equals(two)) { ... } // This is true!
它们都为 GetHashCode() 生成值 3,导致 Equals() 返回 true。显然,这是一个简单的示例,只有两个属性,我可以简单地比较 Equals() 方法中的各个属性。然而,对于更复杂的类,这很快就会失控。
我知道有时只设置一次哈希码并始终返回相同的值是很有意义的。然而,对于需要评估相等性的可变对象,我认为这是不合理的。
在实现 GetHashCode() 时,处理可以轻松互换的属性值的最佳方法是什么?
See Also
重写 System.Object.GetHashCode 的最佳算法是什么? https://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode
首先 - 不要仅根据 GetHashCode() 实现 Equals() - 即使对象不相等,哈希码有时也会发生冲突。
GetHashCode() 的合约包括以下内容:
- 不同的hashcode意味着对象肯定不相等
- 相同的哈希码意味着对象might相等(但也可能不相等)
安德鲁·黑尔建议我合并他的答案:
我建议你阅读这个解决方案 https://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode(由我们自己的乔恩·斯基特 https://stackoverflow.com/users/22656/jon-skeet顺便说一下)计算哈希码的“更好”方法。
不,上面的速度相对较慢并且
没有多大帮助。有些人使用
XOR(例如 a ^ b ^ c),但我更喜欢
乔什·布洛赫(Josh Bloch)的方法中显示的一种方法
“有效的Java”:
public override int GetHashCode()
{
int hash = 23;
hash = hash*37 + craneCounterweightID;
hash = hash*37 + trailerID;
hash = hash*37 + craneConfigurationTypeCode.GetHashCode();
return hash;
}
23和37是任意数字
它们是互质的。
上述相对于 XOR 的好处
方法是如果你有一个类型
它有两个值,分别是
经常相同,对这些进行异或
值总是给出相同的
结果 (0) 而上面的结果
区分它们,除非
你真不幸。
正如上面的代码片段中提到的,您可能还想看看Joshua Bloch 的书《Effective Java》 https://rads.stackoverflow.com/amzn/click/com/0321356683其中包含对该主题的很好的处理(哈希码讨论也适用于 .NET)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)