繁体   English   中英

GetHashCode使用哪个哈希函数?

[英]Which hash function does GetHashCode use?

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

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

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

没有。

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

代表值的类(例如String )重写GetHashCode()以基于所代表的值返回哈希值。
使用的算法由类设计者决定; GetHashCode()的编写方式与其他任何方法一样。
但是,每当Equals()返回true时, GetHashCode()应该返回相等的值。 如果您的班级不这样做,那是错误的。

对象具有可重写的GetHashCode()方法。 对于用户定义的引用类型对象,此方法是否会基于引用的数据生成哈希?

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

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

您必须覆盖它。

大概在String类中实现的哈希函数与在不同引用类型(例如SqlCommand)中实现的哈希函数不同。 在最常见的类中实现的哈希函数是否可以公开获得?

是的,实现了用于字符串和公共值类型的GetHashCode ,以根据这些值生成有效的哈希码。

1)具有相同内容的不同字符串实例将始终产生相同的哈希码。 (请参阅: http : //msdn.microsoft.com/zh-cn/library/system.string.gethashcode.aspx

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM