HashCode 是用来做什么的? 它是唯一的吗?

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

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

133044 次浏览

它并不是 WP7独有的——它存在于所有的产品中。净物体。它有点像你描述的那样,但我不建议你把它作为应用程序的唯一标识符,因为它不一定是独一无二的。

对象. GetHashCode 方法

GetHashCode()用于帮助支持使用对象作为散列表的键。(类似的东西存在于 Java 等)。目标是让每个对象返回一个独特的哈希代码,但这通常不能得到绝对保证。尽管两个逻辑上相等的对象返回的是 一样散列码,但它是 需要

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

通过类比的简单解释

在了解了它的全部内容(MSDN 文档对我来说有点太复杂了)之后,我想通过一个“故事”来简化它,(希望)使它更容易理解。

摘要: 什么是散列码?

Digital Fingerprint - Picture attribute to Pixabay - Freely available for use at: https://pixabay.com/en/finger-fingerprint-security-digital-2081169/

  • 是指纹。

  • - 有什么用?-我们可以用这个指纹来鉴定嫌疑人。

你可以把 Hashcode 想象成我们试图唯一识别某人

我是个侦探,专门搜捕罪犯。我们就叫他残忍先生吧。(当我还是个孩子的时候,他就是一个臭名昭著的杀人犯——他闯入一所房子,绑架并杀害了一个可怜的女孩,抛弃了她的尸体,现在他仍然逍遥法外——顺便说一句,他在我还是个孩子的时候对我造成了心理创伤——但那是另外一回事。库鲁尔先生有一些独特的特征我可以利用这些特征在一大群人中独一无二地辨认出他。我们在澳大利亚有2500万人口。其中一个是库鲁尔先生。我们怎么才能找到他?

认出残忍先生的坏方法

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

识别 Cruel 先生的好方法

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

优点 :

  • 两个人有相同的指纹确实很难(不是不可能,但极不可能)。
  • 库伊尔先生的指纹永远不会改变。
  • 库伊尔先生整个生命的每一部分: 他的外貌、发色、性格、饮食习惯等等都必须(理想地)反映在他的指纹上,这样,如果他有一个兄弟(他们非常相似但不相同)——那么两个 应该都有 不同指纹。我说“应该”是因为我们不能100% 保证这个世界上的两个人会有不同的指纹。
  • 但是我们可以保证,库鲁尔先生的指纹永远都是一样的,而且他的指纹永远不会改变。

上述特征通常可以构成很好的散列函数: 对于给定的输入,我们希望得到唯一的输出——每次输出都相同; 如果我们对输入稍作改变,那么我们应该得到一个完全不同的输出。这个输出是“ hashcode”。

hashFunction(string input) { // etc. }


hashFunction("1234") => "ABCD" output
hashFunction("1235") => "KDSL" output //completely different, even though the input changed only the last digit

那么“碰撞”是什么?

所以想象一下,如果我有了线索,发现有人的指纹和 Cruel 先生的吻合。这是否意味着我找到了库鲁尔先生?

也许吧!我得仔细看看。如果我使用 SHA256(一个散列函数) ,我在一个只有5个人的小镇寻找-然后有一个非常好的机会,我找到了他!但是,如果我使用 MD5(另一个著名的散列函数) ,在一个有 + 2 ^ 1000人的城镇检查指纹,那么两个完全不同的人可能有相同的指纹的可能性相当大。

那么,这一切到底有什么好处呢?

散列代码的唯一真正好处是,如果你想在散列表中放入一些东西——对于散列表,你需要快速找到对象——这就是散列代码的用武之地。它们允许您快速地在散列表中查找内容。这是一种可以大大提高性能的技术,但是要以牺牲精确性为代价。

让我们想象一下,我们有一个满是人的哈希表——澳大利亚有2500万嫌疑人。库鲁尔先生就在那里的某个地方... ..。我们怎样才能找到他真正的 快点?我们需要把它们全部分类: 找到一个潜在的匹配对象,或者以其他方式释放潜在的嫌疑人。你不想考虑每个人的独特性格,因为那会花费太多的时间。你会用什么来代替?你会用散列码!散列码可以告诉你两个人是否不同。乔 · 布洛格斯是否是残忍先生。如果指纹不匹配那你就知道肯定不是残忍先生。但是,如果指纹打印 匹配然后取决于散列函数,机会已经相当不错,你找到了你的男人。但不是100% 。唯一可以确定的方法是进一步调查: (i)他/她是否有机会/动机,(ii)证人等等。

当您使用计算机 时,如果两个对象具有相同的哈希代码值,那么您还需要进一步研究它们是否真正相等。例如,你必须检查对象是否具有相同的高度、重量等,整数是否相同,或者 customer _ id 是否匹配,然后得出结论,它们是否相同。这通常可以通过实现 IComparer 或 IEQuality 接口来完成。

主要摘要

所以基本上散列码就是指纹。

  1. 理论上,两个不同的人/物仍然具有相同的性质 指纹。或者换句话说,如果你有两个相同的指纹,那么它们就不需要来自同一个人或同一个物体。
  2. 但是,同一人/物总是返回 相同的指纹。
  3. 这意味着如果两个对象返回 与众不同散列码,那么您就可以100% 确定这些对象是不同的。

你需要3分钟的时间来理解上面的内容。也许读几遍就能明白了。我希望这能帮到某些人,因为我花了很多悲痛才学会这一切!

这篇文章来自 msdn:

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

“虽然你会听到人们说散列码为给定的输入生成一个唯一的值,但事实是,尽管很难实现,找到两个不同的数据输入,散列为相同的值,在技术上是可行的。然而,真正决定散列算法有效性的因素在于生成的散列码的长度和被散列的数据的复杂性。”

因此,只要使用适合您的数据大小的哈希算法,它就会有唯一的哈希代码。