c# – GetHashCode应该取决于类型吗?
首先,我使用的是描述的GetHashCode算法,here.现在,想象下面的(人为的)示例:
class Foo { public Foo(int intValue,double doubleValue) { this.IntValue = intValue; this.DoubleValue = doubleValue; } public int IntValue { get; private set; } public double DoubleValue { get; private set; } public override int GetHashCode() { unchecked { int hash = 17; hash = hash * 23 + IntValue.GetHashCode(); hash = hash * 23 + DoubleValue.GetHashCode(); return hash; } } } class DerivedFoo : Foo { public DerivedFoo(int intValue,double doubleValue) : base(intValue,doubleValue) { } } 如果我有一个Foo和一个DerivedFoo,每个属性具有相同的值,那么它们将具有相同的哈希码.这意味着我可以拥有HashSet< Foo>或者在Linq中使用Distinct方法,这两个实例将被视为相同. 我可能只是误解了GetHashCode的使用,但我希望这两个实例有不同的哈希码.这是一个无效的期望还是GetHashCode应该在计算中使用类型? (或者DerivedClass是否也会覆盖GetHashCode)? 附:我意识到关于这个主题的SO有很多很多问题,但是我没有发现直接回答这个问题的问题. 解决方法
GetHashCode()不应该保证唯一性(尽管如果尽可能唯一,它有助于提高性能).
GetHashCode()的主要规则是等效对象必须具有相同的哈希代码,但这并不意味着非等效对象不能具有相同的哈希代码. 如果两个对象具有相同的哈希码,则调用Equals()方法以查看它们是否相同.由于类型不同(取决于你如何编码你的Equals过载),它们将不相等,因此它会没问题. 即使您对每种类型都有不同的哈希码算法,仍然总是存在冲突的可能性,因此也需要进行Equals()检查. 现在给出上面的示例,您不实现Equals(),这将使每个对象都不同,无论哈希代码如何,因为对象的Equals()的默认实现是引用相等性检查. 如果还没有,请继续为每个类型重写Equals()(如果你愿意,可以继承你的GetHashCode()实现,或者有新的类型),你可以确保它的类型在声明它们相等之前,compare-to对象是相同的.并确保始终实现Equals()和GetHashCode(),以便: > Equals()对象必须具有相同的GetHashCode()结果.>具有不同GetHashCode()的对象不能是Equals(). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |