1

我假设 .NET 中的(通用)Dictionary 类在其键上使用 GetHashCode() 方法来生成哈希。我有两个问题由此引出:

  1. Object 有一个可覆盖的 GetHashCode() 方法。对于用户定义的引用类型对象,此方法是否会根据引用的数据生成哈希?例如,如果我有一个仅包含一个 String 实例变量的类 OneString - 具有匹配字符串的此类的两个单独实例是否总是产生相同的哈希码?或者是否需要重写 OneString 的 GetHashCode() 方法才能实现此功能?

  2. 推测在 String 类中实现的散列函数与在不同的引用类型(例如 BitmapImage)中实现的散列函数不同。在最常见的类中实现的哈希函数是否公开可用?

4

3 回答 3

3

不。

object.GetHashCode()仅基于该对象的标识返回一个值。
它不会为两个等效对象返回相同的值;它完全不知道对象的类型或含义。

表示值的类(例如String)会覆盖GetHashCode()以根据表示的值返回散列。
使用的算法取决于类设计者;GetHashCode()像任何其他方法一样编写。
但是,只要返回 true ,GetHashCode()就应该返回相等的值;Equals()如果你的班级不这样做,那就错了。

于 2012-05-29T23:10:04.783 回答
3

Object 有一个可覆盖的 GetHashCode() 方法。对于用户定义的引用类型对象,此方法是否会根据引用的数据生成哈希?

不,默认GetHashCode方法不会尝试使用类中的数据,它仅基于引用。具有相同内容的两个独立实例将具有不同的哈希码。

如果我有一个仅包含一个 String 实例变量的类 OneString - 具有匹配字符串的此类的两个单独实例是否总是产生相同的哈希码?或者是否需要重写 OneString 的 GetHashCode() 方法才能实现此功能?

你必须覆盖它。

推测在String类中实现的散列函数与在不同的引用类型(例如SqlCommand)中实现的散列函数是不同的。在最常见的类中实现的哈希函数是否公开可用?

是的,实现了GetHashCodefor 字符串和通用值类型以从值中生成有效的哈希码。

于 2012-05-29T23:18:27.840 回答
0

1)具有相同内容的不同字符串实例总是会产生相同的哈希码。(见:http: //msdn.microsoft.com/en-us/library/system.string.gethashcode.aspx

2) GetHashCode() 是 Object 基类的一个方法,所有类型都从该方法派生。因此,对于任何类型,总是有此方法的实现。

于 2012-05-29T23:11:22.600 回答