我可以使用GetHashCode跟踪对象标识吗?

时间:2009-09-03 20:39:00

标签: c# identity gethashcode

GetHashCode()有什么用?我可以使用GetHashCode()跟踪对象标识吗?如果是这样,你能提供一个例子吗?

4 个答案:

答案 0 :(得分:22)

哈希码不是关于身份,而是关于平等。事实上,你可以说他们是关于不平等的

  • 如果两个对象具有相同的哈希码,则可能相等
  • 如果两个对象具有不同的哈希码,则它们相等

散列码不是唯一的,它们也不保证相等(两个对象可能具有相同的散列但仍然不相等)。

至于它们的用途:它们几乎总是用来快速选择可能相等的对象然后测试实际相等,通常在键/值映射中(例如Dictionary<TKey, TValue>)或一组(例如HashSet<T>)。

答案 1 :(得分:5)

不,不保证HashCode是唯一的。但是您已经有了对象的引用,它们非常适合使用object.ReferenceEquals()来跟踪身份。

答案 2 :(得分:1)

值本身用于哈希算法,例如哈希表。

在其默认实现中,GetHasCode不保证对象的唯一性,因此不应该使用.NET对象,

在您自己的类中,通常优先覆盖GetHashCode以为对象创建唯一值。

答案 3 :(得分:1)

它用于需要散列的算法\数据结构(例如散列表)。哈希码本身不能用于跟踪对象标识,因为具有相同哈希的两个对象不一定相等。但是,两个相等的对象应该具有相同的哈希码(这就是为什么C#如果覆盖一个而不覆盖另一个则发出警告)。