首页 / 知识
关于c#:Object.GetHashCode()是引用或值唯一的吗?
2023-04-13 15:02:00

Is Object.GetHashCode() unique to a reference or a value?关于Object.GetHashCode()的MSDN文档描述了该方法应如何工作的3个相互矛盾的规则。 规则1和3与我矛盾。 Object.GetHashCode()是否基于对象的值或对该对象的引用返回唯一数字。 如果我重写该方法,则可以选择要使用的方法,但是如果有人知道的话,我想知道内部使用的方法。
在一定程度上,它们是。原因很简单:如果将对象存储在哈希表中,并且通过更改其值来更改其哈希,则哈希表将丢失该值,并且无法通过查询哈希表再次找到它。重要的是,尽管对象存储在哈希表中,但它们保留其哈希值。 要实现这一点,通常最简单的做法是使可哈希对象不可变,从而避免整个问题。但是,仅使确定哈希值的那些字段不可变就足够了。 考虑以下示例:
人们很少更改生日,大多数人从不更改姓名(结婚时除外)。但是,它们的鞋号可能会任意增大,甚至会缩小。因此,合理地使用生日和姓名来识别人物,而不是鞋子的大小。哈希值应反映以下内容:
不确定要使用的MSDN文档。查看有关Object.GetHashCode的当前文档(http://msdn.microsoft.com/zh-cn/library/system.object.gethashcode.aspx)提供了以下"规则":
如果您指的是第二个要点,则此处的关键短语是"只要没有对对象状态进行任何修改"和"仅对于应用程序的当前执行为true"。 同样从文档中
至于实际的实现,它明确指出,当且仅当该派生类将值相等定义为引用相等并且类型不是值类型时,派生类才可以遵循Object.GetHashCode实现。换句话说,Object.GetHashCode的默认实现将基于引用相等性,因为没有要使用的实际实例字段,因此不能保证不同对象的唯一返回值。否则,您的实现应特定于您的类型,并应至少使用一个实例字段。例如,String.GetHashCode的实现针对相同的字符串值返回相同的哈希码,因此,如果两个String对象表示相同的字符串值,则它们返回相同的哈希码,并使用字符串中的所有字符生成该哈希值。 规则1和3并不是真正的矛盾。 对于引用类型,哈希码是从对对象的引用派生的-更改对象的属性,并且引用是相同的。 对于值类型,哈希码从值派生,更改值类型的属性,您将获得值类型的全新实例。
有关如何处理 我不确定在真正的.NET Framework中如何实现Object.GetHashCode,但是在Rotor中,它使用对象的SyncBlock索引作为哈希码。网络上有一些关于它的博客文章,但是大多数来自2005年。 默认情况下,它基于对对象的引用进行操作,但这意味着它是完全相同的对象,因此两者将返回相同的哈希值。但是像字符串类一样,散列应该基于该值。" a"和" b"将具有不同的哈希,但是" a"和" a"将返回相同的哈希。 |
最新内容
相关内容
linux进入文档命令?
linux进入文档命令?,工作,地址,图片,系统,标准,命令,信息,设备,一致,发行,Linux系统终端打开文件用什么命令1、linux下打开图片文件的命令:eoglinux上传文档命令?
linux上传文档命令?,服务,工具,密码,系统,软件,工作,电脑,综合,命令,文件,Linux上传文件到服务器命令是什么呢1、ssh ssh username@remotehostlinux如何命令建文档?
linux如何命令建文档?,时间,名字,文件,系统,新增,命令,文件名,密码,工作,目录,linux怎么创建文件终端下键入:touch加文件名,这样就创建了一个文linux命令打开文档?
linux命令打开文档?,系统,软件,图片,电脑,一致,环境,名称,发行,中心,官方网站,Linux命令如何创建,复制,打开,删除文件呢创建一个叫test的文件linux剪切文档命令是?
linux剪切文档命令是?,标准,系统,数据,文件,命令,地方,第一,位置,电子,名字,linux怎么删除指定目录的内容?-f,--force强制删除:忽略不存在的文件linux简单的文档命令?
linux简单的文档命令?,系统,地址,标准,工作,命令,数据,管理,时间,信息,单位,linux必学的60个命令安装和登录命令:login、shutdown、halt、reboolinux查询文档命令?
linux查询文档命令?,工作,地址,标准,命令,管理,信息,文件,目录,内容,终端,linux常用命令linux常用命令:查看内核版本:uname-a。图形界面:init5或linux查询函数命令?
linux查询函数命令?,系统,信息,名称,标准,函数,百度,代码,名字,最新,实时,Linux下查找一个函数在哪个库文件中1、默认状态下,gcc并不搜索数学库linux命令描述中文?
linux命令描述中文?,地址,系统,工作,信息,目录,命令,基础,工具,标准,文件,Linux命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出目录的linux文档常用命令?
linux文档常用命令?,系统,工作,地址,管理,命令,信息,基础,目录,常用命令,文件,linux系统常用操作命令linux常用命令有pwd命令、cd命令、ls命令linux命令文档离线版?
linux命令文档离线版?,地址,系统,工作,标准,命令,信息,管理,文件,单位,数据,基本linux命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出linux命令输入方法?
linux命令输入方法?,系统,电脑,密码,管理,地址,命令,网站,工具,首开,位置,linux终端输入~怎么弄中间在电脑上打开需要的Word文件进入。进入到文