0

人们为什么使用 GetHashCode 以及它的用途。我对这个主题进行了谷歌搜索,但不清楚程序员为什么以及何时使用这种方法。有人可以解释这个 GetHashCode 方法吗?

4

3 回答 3

6

该方法的目的是为哈希表创建一个键。

Eric Lippert 的一篇非常好的文章:

http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/

GetHashCode 是做什么用的?

它在设计上只对一件事有用:将对象放入哈希表中。由此得名。

为什么我们首先在 Object 上有这个方法?

类型系统中的每个对象都应该提供一个 GetType 方法,这是完全合理的;数据描述自身的能力是 CLR 类型系统的一个关键特性。每个对象都应该有一个 ToString 是有道理的,以便它能够将自身的表示形式打印为字符串,以用于调试目的。对象应该能够将自己与其他对象进行比较以获得相等性似乎是合理的。但是为什么每个对象都应该能够散列自己以插入散列表中呢?要求每个对象都能够做到这一点似乎很奇怪。

我认为如果我们今天从头开始重新设计类型系统,散列可能会以不同的方式完成,也许使用 IHashable 接口。但是在设计 CLR 类型系统时,没有泛型类型,因此需要一个通用哈希表来存储任何对象。

于 2013-06-19T17:08:49.683 回答
4

来自 MSDN:

哈希码是一个数值,用于在相等性测试期间识别对象。它还可以用作集合中对象的索引

使用 的返回值GetHashCode来判断两个对象是否相等比调用Equals对象类型的默认实现要快。

请参阅Dictionary(Of TKey, TValue)并且Hashtable Class因为它们都使用哈希码来比较集合中的元素。一些 LINQ 函数也Enumerable.Distinct使用哈希码。

于 2013-06-19T17:07:45.637 回答
0

主要是为了确保所需的对象.. 例如,如果您有具有相同值但它们不相同的对象,因为内存中的位置不同并且代表完全不同的对象(同一类和相同值的两个不同实例)。当您想要更新或删除该对象时,您可以进行哈希来验证您想要更新的所需对象......在我的情况下

如果我们使用其他类型和情况的休眠,我们会使用它

于 2013-06-19T17:13:51.360 回答