什么是hashCode用于? 它是独特的吗?

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

你能帮我解释什么是hashCode和getHashCode()使用?

MSDN说 :

哈希码是在平等testing期间用于标识对象的数值。 它也可以作为集合中对象的索引。

GetHashCode方法适用于散列algorithm和数据结构,如散列表。

GetHashCode方法的默认实现不保证不同对象的唯一返回值。 此外,.NET Framework不保证GetHashCode方法的默认实现,并且它返回的值在不同版本的.NET Framework之间将保持不变。 因此,此方法的默认实现不能用作用于散列目的的唯一对象标识符。

GetHashCode方法可以被派生types覆盖。 值types必须重写此方法以提供适合该types的散列函数,并在散列表中提供有用的分布。 为了唯一性,哈希码必须基于实例字段或属性的值而不是静态字段或属性。

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

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

MSDN文档杀死了我的一些脑细胞。 在了解了所有关于我的想法之后,我想用一个(希望)更简单的解释来比喻你的痛苦:

当我们尝试唯一标识某人时,请考虑一个哈希码

我是一个侦探,在寻找一个罪犯。 让我们称他为Cruel先生。 (当我小时候他是一个臭名昭着的凶手 – 他闯入一所房子被绑架并杀害一个可怜的女孩,倾倒了她的身体,他仍然在松散 – 但这是一个单独的事情)。 Cruel先生有一些奇特的特点,我可以用它来唯一地识别他之间的人海。 我们在澳大利亚有2500万人。 其中之一是Cruel先生。 我们怎么能find他?

识别残酷的坏方法

Cruel先生显然有蓝眼睛。 这没什么帮助,因为澳大利亚近一半的人口也有蓝眼睛。

识别残酷先生的好方法

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

优点

  • 两个人真的很难有相同的指纹(不是不可能的,但极不可能)。
  • Cruel先生的指纹永远不会改变。
  • Cruel先生的整个存在的每一个部分:他的外表,头发的颜色,个性,饮食习惯等(必要时)都必须反映在他的指纹中,如果他有一个兄弟(他们非常相似但不一样) 应该不同的指纹。 我说“应该”,因为我们不能保证100%这个世界上的两个人会有不同的指纹。
  • 但是我们总能保证Cruel先生总是拥有相同的指纹 – 而且他的指纹永远不会改变。

上述特征通常使得散列函数更好。

那么与“碰撞”有什么关系呢?

所以想象一下,如果我find了领先者,并且find与Cruel先生的指纹相匹配的人, 这是否意味着我find了Cruel先生?

……..也许! 我必须仔细看看。 如果我正在使用SHA256,而且我正在一个只有5个人的小城镇里寻找,那么我很有机会find他! 但是如果我使用MD5并在+ 2 ^ 1000人的城镇检查指纹,那么两个完全不同的人可能具有相同的指纹是相当好的可能性。

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

哈希码的唯一真正好处是如果你想把某些东西放到哈希表中,并且用哈希表来快速find对象,这就是哈希码的来源。

如果你想知道两个人是否不同,你会用它。 Joe Bloggs是不是先生残忍。 如果印刷品不匹配,那么你知道这绝对不是先生残忍。 如果指纹匹配,然后根据你使用的散列函数,你find你的男人的机会已经相当不错了。 但这不是100%。 唯一可以确定的方法是进一步调查:(i)他/她是否有机会/动机,(ii)证人等等。当你使用计算机时,如果两个对象具有相同的散列码值,则你还需要进一步调查是否真的平等。 例如,你必须检查物体是否具有相同的高度,相同的重量等,然后得出结论是否相同。 这通常是通过实现一个IComparer或IEquality接口来完成的。

重要摘要

所以基本上hashcode是一个指纹。

数字指纹 - 图片属性Pixabay  - 自由使用在:https://pixabay.com/en/finger-fingerprint-security-digital-2081169/

  1. 理论上两个不同的人/物体仍然可以具有相同的指纹。 换句话说, 如果你有两个相同的指纹,那么它们不需要来自同一个人/物体。
  2. Buuuuuut, 同一个人/对象将始终返回相同的指纹
  3. 这意味着如果两个对象返回不同的哈希码,那么您就知道这些对象是不同的。

需要3分钟的时间才能把握住上述的问题。 也许读了几次,直到它是有道理的。

我希望这可以帮助一个人,因为我花了很多的痛苦,让我学习这一切!

GetHashCode()用于帮助支持使用该对象作为散列表的关键字。 (类似的东西存在于Java等)。 目标是为每个对象返回一个明确的散列码,但这往往不能绝对保证。 尽pipe2个逻辑上相等的对象返回相同的散列码,但这是必需的

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

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

Object.GetHashCode方法

这是从这里的MSDN文章:

https://blogs.msdn.microsoft.com/tomarcher/2006/05/10/are-hash-codes-unique/

“虽然你会听到人们说哈希码为给定的input产生一个唯一的值,但事实是,虽然很难完成, 但是在技术上可以find两个不同的数据input哈希到相同的值 。确定关于散列algorithm的有效性的因素在于所生成的散列码的长度和被散列的数据的复杂度。

所以只需使用适合您的数据大小的哈希algorithm,它将具有唯一的哈希码。