永发信息网

GetHashCode()方法(C#)

答案:2  悬赏:80  手机版
解决时间 2021-01-25 22:56
  • 提问者网友:献世佛
  • 2021-01-25 15:36
我写了一个类,用它来模拟点(Point)结构,但是里面有个GetHashCode()在自定义equals方法之后必须写,那么这个GetHashCode()到底该怎么写呢?事实上我直接在里面写一句return 0;应该也不会出错吧,但是哈希码要保证唯一,那么这里面该怎么实现呢?如果可以,能不能解说一下Point结构是怎么实现这个方法的?谢谢!
最佳答案
  • 五星知识达人网友:时间的尘埃
  • 2021-01-25 16:47
Object..::.GetHashCode 方法

更新:2007 年 11 月

用作特定类型的哈希函数。

命名空间: System
程序集: mscorlib(在 mscorlib.dll 中)
语法
Visual Basic(声明)
Public Overridable Function GetHashCode As Integer
Visual Basic (用法)
Dim instance As Object
Dim returnValue As Integer

returnValue = instance.GetHashCode()
C#
public virtual int GetHashCode()
Visual C++
public:
virtual int GetHashCode()
J#
public int GetHashCode()
JScript
public function GetHashCode() : int

返回值
类型:System..::.Int32
当前 Object 的哈希代码。
备注
GetHashCode 方法适用于哈希算法和诸如哈希表之类的数据结构。

GetHashCode 方法的默认实现不保证针对不同的对象返回唯一值。而且,.NET Framework 不保证 GetHashCode 方法的默认实现以及它所返回的值在不同版本的 .NET Framework 中是相同的。因此,在进行哈希运算时,该方法的默认实现不得用作唯一对象标识符。

GetHashCode 方法可以由派生类型重写。值类型必须重写此方法,以提供适合该类型的哈希函数和在哈希表中提供有用的分布。为了获得最佳结果,哈希代码必须基于实例字段或属性(而非静态字段或属性)的值。

用作 Hashtable 对象中键的对象还必须重写 GetHashCode 方法,因为这些对象必须生成其各自的哈希代码。如果用作键的对象不提供 GetHashCode 的有用实现,您可以在构造 Hashtable 对象时指定哈希代码提供程序。在 .NET Framework 2.0 版之前,哈希代码提供程序是基于 System.Collections..::.IHashCodeProvider 接口的。从 2.0 版开始,哈希代码提供程序基于 System.Collections..::.IEqualityComparer 接口。

对实现者的说明:
哈希函数用于快速生成一个与对象的值相对应的数字(哈希代码)。哈希函数通常是特定于每个 Type 的,而且,必须至少使用一个实例字段作为输入。

哈希函数必须具有以下特点:

如果两个对象的比较结果相等,则每个对象的 GetHashCode 方法都必须返回同一个值。但是,如果两个对象的比较结果不相等,则这两个对象的 GetHashCode 方法不一定返回不同的值。

一个对象的 GetHashCode 方法必须总是返回同一个哈希代码,但前提是没有修改过对象状态,对象状态用来确定对象的 Equals 方法的返回值。请注意,这仅适用于应用程序的当前执行,再次运行该应用程序时可能会返回另一个哈希代码。

为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
全部回答
  • 1楼网友:一袍清酒付
  • 2021-01-25 17:44
写个方法 /// <summary> /// 返回执行select distinct后的datatable /// </summary> /// <param name="sourcetable">源数据表</param> /// <param name="fieldnames">字段集</param> /// <returns></returns> private datatable selectdistinct(datatable sourcetable, params string[] fieldnames) { object[] lastvalues; datatable newtable; datarow[] orderedrows; if (fieldnames == null || fieldnames.length == 0) throw new argumentnullexception("fieldnames"); lastvalues = new object[fieldnames.length]; newtable = new datatable(); foreach (string fieldname in fieldnames) newtable.columns.add(fieldname, sourcetable.columns[fieldname].datatype); orderedrows = sourcetable.select("", string.join(",", fieldnames)); foreach (datarow row in orderedrows) { if (!fieldvaluesareequal(lastvalues, row, fieldnames)) { newtable.rows.add(createrowclone(row, newtable.newrow(), fieldnames)); setlastvalues(lastvalues, row, fieldnames); } } return newtable; } private bool fieldvaluesareequal(object[] lastvalues, datarow currentrow, string[] fieldnames) { bool areequal = true; for (int i = 0; i < fieldnames.length; i++) { if (lastvalues[i] == null || !lastvalues[i].equals(currentrow[fieldnames[i]])) { areequal = false; break; } } return areequal; } private datarow createrowclone(datarow sourcerow, datarow newrow, string[] fieldnames) { foreach (string field in fieldnames) newrow[field] = sourcerow[field]; return newrow; } private void setlastvalues(object[] lastvalues, datarow sourcerow, string[] fieldnames) { for (int i = 0; i < fieldnames.length; i++) lastvalues[i] = sourcerow[fieldnames[i]]; }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯