我有一个覆盖GetHashCode()的CustomObject对象。 我有一个HashSet,我可以使用具有相同哈希码的两个不同对象调用add。 两者都被添加,稍后我最终会遇到一些数据库插入问题(主键重复)...使用hashSet的目的是连接到这些数据库插入(避免键冲突)。
我可能错过了HashSet的一些属性吗?即使我在添加(.Add)之前尝试检查(.Contains),我最终也会添加hashCode重复...
答案 0 :(得分:26)
因为HashSet<T>
成员资格基于对象相等,而不是哈希代码相等。只要成员根据HashSet<T>
不同,Equals
的每个成员都具有相同的哈希码是完全合法的。哈希码在HashSet<T>
中发挥的作用是快速测试成员资格。如果您有一个对象且其哈希码不在HashSet<T>
中,那么您就知道该对象不在HashSet<T>
中。如果你有一个对象并且它的哈希代码在HashSet<T>
中,那么你必须使用相同的哈希代码来测试对象链,使用Equals
来检查对象是否实际在是HashSet<T>
还是不。这就是平衡哈希码分布很重要的原因。但事实并非需要唯一的哈希码。
答案 1 :(得分:10)
重写GetHashCode是不够的。您还需要覆盖Equals函数。
答案 2 :(得分:1)
不使用hashsets来尝试避免重复值。使用它们来平衡哈希表!