Home HashCode
Post
Cancel

HashCode

原文链接

什么是HashCode

HashCode可以理解成是用来标识某件东西的唯一标识符

我是一名侦探,正在寻找罪犯。让我们称他为 Mr Cruel。 Mr Cruel有一些特殊的特征,我可以用来在茫茫人海中唯一地识别他。我们在澳大利亚有2500万人。其中之一是 Mr Cruel。我们怎么能找到他?

识别 Mr Cruel的坏方法

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

识别残忍先生的好方法

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

优点:

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

上述特征通常可以产生良好的哈希函数:对于给定的输入,我们想要一个唯一的输出 - 每次都相同的输出;如果我们稍微改变输入,那么我们应该得到一个完全不同的输出。

1
2
hashFunction("1234") => "ABCD" output
hashFunction("1235") => "KDSL" output

什么是冲突(Collision)

所以想象一下,如果我得到一个线索,我发现有人与 Mr Cruel的指纹相匹配。这是否意味着我找到了残忍先生?

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

HashCode到底有什么好处呢

哈希代码的唯一真正好处是如果你想把一些东西放在哈希表中,使用哈希表你想快速找到对象,这就是哈希代码的用武之地。它们允许您非常快速地在哈希表中查找内容。这是一个可以大幅提高性能的方法,但以很小的准确性为代价。

因此,让我们想象一下,我们有一个充满人的哈希表——澳大利亚有2500万嫌疑人。 Mr Cruel就在那里的某个地方…..我们怎样才能很快找到他?我们需要对它们进行分类:找到潜在的匹配,或者以其他方式宣告潜在的嫌疑人无罪。你不想考虑每个人的独特特征,因为这会花费太多时间。你会用什么来代替?你会使用哈希码!哈希码可以告诉您两个人是否不同。Joe Bloggs是否是 Mr Cruel。如果指纹不匹配,那么你就知道这绝对不是 Mr Cruel。但是,如果指纹确实匹配,那么根据您使用的哈希函数,您找到您的男人的可能性已经相当大。但这不是100%。您唯一可以确定的方法是进一步调查:

  • 他/她是否有机会/动机
  • 证人等

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

HashCode总结

  • 两个相同的对象一定拥有相同的HashCode
  • 拥有相同HashCode的不一定是同一个对象,所以我们除了匹配HashCode之外,我们还需要重写Equality函数
This post is licensed under CC BY 4.0 by the author.