我假设.NET中的(通用)Dictionary类在其键上使用GetHashCode()方法来生成哈希。我有两个问题:
Object具有可覆盖的GetHashCode()方法。对于用户定义 引用类型对象,将此方法生成基于的哈希 参考数据?例如如果我有一个包含的类OneString 只有一个String实例变量 - 将是两个独立的实例 这个具有匹配字符串的类总是产生相同的哈希码? 或者是否需要覆盖OneString的GetHashCode()方法 实现这一功能?
大概在String类中实现的散列函数与在不同引用类型(例如BitmapImage)中实现的散列函数不同。最公开的类中实现的哈希函数是否公开可用?
答案 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类的方法,所有类型都是从该类派生的。因此,对于任何类型,总会有这种方法的实现。