8

我有一个覆盖 GetHashCode() 的 CustomObject 对象。我有一个 HashSet,我可以用两个具有相同哈希码的不同对象调用 add。两者都被添加,后来我遇到了一些数据库插入问题(主键重复)......使用 hashSet 的目的与这些数据库插入有关(避免键冲突)。

我可能会错过 HashSet 的某些属性吗?即使我在添加(.Add)之前尝试检查(.Contains),我最终也会添加hashCode重复......

4

3 回答 3

30

因为HashSet<T>成员资格基于对象相等,而不是哈希码相等。a 的每个成员HashSet<T>拥有相同的哈希码是完全合法的,只要成员根据Equals. 哈希码的作用HashSet<T>是快速测试成员资格。如果你有一个对象并且它的哈希码不在 中HashSet<T>,那么你就知道该对象不在HashSet<T>. 如果您有一个对象并且它的哈希码在 中HashSet<T>,那么您必须使用相同的哈希码遍历对象链来测试是否相等,Equals以查看该对象是否实际上在 中HashSet<T>。这就是为什么平衡的哈希码分布很重要。但是,唯一的哈希码并不是必须的。

于 2012-06-06T15:07:32.450 回答
11

覆盖 GetHashCode 是不够的。您还需要覆盖 Equals 函数。

于 2012-06-06T15:10:18.980 回答
0

不要使用哈希集来避免重复值。使用它们来平衡哈希表!

于 2012-06-06T15:07:43.510 回答