C# hashCode的用途是什么?它是独一无二的吗?

C# hashCode的用途是什么?它是独一无二的吗?,c#,hashcode,C#,Hashcode,我注意到WP7中的每个控件、项中都有一个getHashCode()方法,它返回一个数字序列。我可以使用此哈希代码来标识项目吗?例如,我想识别设备中的图片或歌曲,并检查其位置。如果为特定项目提供的哈希代码是唯一的,则可以这样做 你能帮我解释一下hashCode和getHashCode()的用途吗?: 哈希代码是用于标识对象的数值 在平等测试期间。它还可以用作对象的索引 在一个集合中 GetHashCode方法适用于哈希算法和 数据结构,如哈希表 GetHashCode方法的默认实现没有 确保不同对

我注意到WP7中的每个控件、项中都有一个
getHashCode()
方法,它返回一个数字序列。我可以使用此哈希代码来标识项目吗?例如,我想识别设备中的图片或歌曲,并检查其位置。如果为特定项目提供的哈希代码是唯一的,则可以这样做

你能帮我解释一下hashCode和getHashCode()的用途吗?

哈希代码是用于标识对象的数值 在平等测试期间。它还可以用作对象的索引 在一个集合中

GetHashCode方法适用于哈希算法和 数据结构,如哈希表

GetHashCode方法的默认实现没有 确保不同对象的返回值唯一。此外 .NET Framework不保证 GetHashCode方法,它返回的值在 不同版本的.NET Framework。因此,违约 此方法的实现不能用作唯一对象 用于哈希目的的标识符

GetHashCode方法可以由派生类型重写。价值 类型必须重写此方法以提供 适用于该类型,并在 哈希表。为了唯一性,哈希代码必须基于值 用于实例字段或属性而不是静态字段或属性 财产

在哈希表对象中用作键的对象也必须重写 GetHashCode方法,因为这些对象必须生成自己的哈希 代码。如果用作键的对象未提供有用的 实现GetHashCode时,可以指定哈希代码提供程序 当构建哈希表对象时。在.NET框架之前 版本2.0时,哈希代码提供程序基于 System.Collections.IHashCodeProvider接口。从版本开始 2.0,哈希代码提供程序基于 System.Collections.IEqualityComparer接口

基本上,哈希代码的存在使哈希表成为可能。
保证两个相等的对象具有相等的哈希码。
两个不相等的对象不能保证具有不相等的哈希代码(这称为冲突)。

它不是WP7独有的,它存在于所有.Net对象上。它有点像你描述的那样,但我不推荐它作为你应用程序中的唯一标识符,因为它不能保证是唯一的

GetHashCode()
用于帮助支持将对象用作哈希表的键。(Java等中也存在类似的情况)。目标是让每个对象返回一个不同的哈希代码,但这通常不能绝对保证。但两个逻辑上相等的对象返回相同的哈希代码是必需的


典型的哈希表实现从hashCode值开始,取一个模数(从而将该值限制在一个范围内),并将其用作“bucket”数组的索引。

了解了它的全部内容后,我想通过类比编写一个更简单的解释:

摘要:什么是哈希代码?
  • 这是指纹。我们可以用这个指纹来识别感兴趣的人
详情请参阅下文:

把Hashcode想象成我们试图唯一识别某人的代码

我是一名侦探,在寻找罪犯。让我们称他为残忍先生吧。(我小时候,他是一个臭名昭著的杀人犯——他闯入一所房子,绑架并谋杀了一个可怜的女孩,扔掉了她的尸体,他仍然逍遥法外——但这是另外一回事)。残忍先生有一些特殊的特征,我可以利用这些特征在人海中唯一地识别他。我们在澳大利亚有2500万人口。其中一位是残忍先生。我们怎么才能找到他

识别残忍先生的坏方法

显然,残忍先生有一双蓝眼睛。这没有多大帮助,因为几乎一半的澳大利亚人口也有蓝眼睛

识别残忍先生的好方法

我还能用什么?我知道:我会用指纹

优点:

  • 两个人要有相同的指纹真的很难(不是不可能,但极不可能)
  • 残忍先生的指纹永远不会改变
  • 残忍先生整个生命的每一个部分:他的容貌、头发颜色、性格、饮食习惯等都必须(理想情况下)反映在他的指纹上,这样,如果他有一个兄弟(非常相似但不相同),那么两人的指纹都应该不同。我说“应该”,是因为我们不能100%保证这个世界上的两个人会有不同的指纹
  • 但我们可以保证,克鲁姆先生的指纹永远是一样的,他的指纹永远不会改变
上述特性通常是良好的哈希函数

那么“碰撞”是怎么回事?

想象一下,如果我找到线索,发现有人的指纹与残忍先生的指纹相符。这是否意味着我找到了残忍先生

……也许吧!我必须仔细看看。如果我正在使用SHA256(一个散列函数),并且我正在一个只有5个人的小镇上寻找,那么我很有可能找到他!但是如果我使用MD5(另一个著名的散列函数)并在一个有+2^1000人的城镇中检查指纹,那么很可能两个完全不同的人拥有相同的指纹

那么所有这些的好处是什么呢?

hashcodes唯一的真正好处是,如果您想将某些内容放入哈希表中,并且使用哈希表可以快速查找对象,而这正是哈希代码的用武之地。它们允许您在哈希表中查找真正的内容