GetHashCode使用哪个哈希函数?

时间:2012-05-29 23:07:25

标签: c# hashtable hash

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

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

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

3 个答案:

答案 0 :(得分:3)

没有

object.GetHashCode()仅根据该对象的身份返回一个值 它不会为两个等效对象返回相同的值;它完全没有意识到对象的类型或含义。

表示值的类(例如String)覆盖GetHashCode()以基于所表示的值返回哈希值。
使用的算法取决于类设计者; GetHashCode()的写法与任何其他方法一样 但是,只要GetHashCode()返回true,Equals()就会返回相等的值;如果你的班级没有这样做,那就错了。

答案 1 :(得分:3)

  

Object具有可覆盖的GetHashCode()方法。对于用户定义   引用类型对象,将此方法生成基于的哈希   参考数据?

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

  

如果我有一个OneString类,它只包含一个String实例   变量 - 将使用匹配的此类的两个单独实例   字符串总是产生相同的哈希码?或者是GetHashCode()   需要重写OneString的方法来实现这一点   功能?

你必须覆盖它。

  

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

是的,实现字符串和公共值类型的GetHashCode以从值中生成有效的哈希码。

答案 2 :(得分:0)

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

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