getHashCode()
的方法,它返回一系列数字。我能否使用此哈希码来识别一个项目?例如,我想在设备中识别一张图片或一首歌曲,并检查其位置。如果特定项目的哈希码是唯一的,则可以完成此操作。你能帮忙解释一下 hashCode 和
getHashCode()
的用途吗?getHashCode()
的方法,它返回一系列数字。我能否使用此哈希码来识别一个项目?例如,我想在设备中识别一张图片或一首歌曲,并检查其位置。如果特定项目的哈希码是唯一的,则可以完成此操作。getHashCode()
的用途吗?在了解了它的全部内容后(MSDN文档对我来说有点复杂),我想通过一个“故事”来简化它,希望可以更容易理解。
这是一个指纹。
它有什么用处?我们可以使用这个指纹来识别感兴趣的人。
您可以把哈希码想象成我们尝试唯一地识别某人
我是一名侦探,正在寻找罪犯。让我们称他为Cruel先生。(当我还是孩子时,他是臭名昭著的杀人犯——他闯进一所房子绑架并谋杀了一个可怜的女孩,抛弃了她的尸体,他仍然逍遥法外——他在我小时候给我留下了创伤,但那是另外一回事。)Cruel先生有某些特殊的特征,我可以使用这些特征在人海中唯一地识别他。我们在澳大利亚有2500万人口。其中一个是Cruel先生。怎么找到他呢?
不好的识别Cruel先生的方法
显然,Cruel先生有蓝眼睛。这没什么帮助,因为澳大利亚几乎一半的人都有蓝眼睛。
好的识别Cruel先生的方法
还有什么其他方法吗? 我知道:我将使用指纹!
优点:
上述特征通常是良好哈希函数的基础:对于给定的输入,我们希望获得唯一的输出-每次都是相同的输出;如果我们微调输入,则应该得到完全不同的输出。这个输出,就是“哈希码”。
hashFunction(string input) { // etc. }
hashFunction("1234") => "ABCD" output
hashFunction("1235") => "KDSL" output //completely different, even though the input changed only the last digit
那么什么是“碰撞”?
假设我得到一份线索,发现有人的指纹与克鲁先生的指纹相匹配。这意味着我找到了克鲁先生吗?可能!我必须仔细检查。如果我使用SHA256(一种哈希函数)并在只有5个人的小镇中寻找,那么我很可能找到了他!但是,如果我使用另一种著名的哈希函数MD5,在一个超过2^1000人的城市中查找指纹,则会有非常大的可能性出现两个完全不同的人具有相同的指纹。
那么这一切的好处是什么?
哈希码的唯一真正好处是,如果您想将某些东西放入哈希表中,而哈希表中您想快速找到对象的位置,那么哈希码就非常实用。它是通过一个小小的牺牲来大幅提高性能的技巧,而这个小小的牺牲是准确性。
假设我们有一个填满了人员信息的哈希表——澳大利亚2500万嫌疑人。克鲁先生就在其中某个位置.....我们如何快速地找到他呢?你不想考虑每个人的独特特征,因为那会花费太多时间。相反,你可以使用哈希码!哈希码可以告诉您两个人是否不同,例如Joe Bloggs不是克鲁先生。如果指纹不匹配,那么你就知道肯定不是克鲁先生。但是,如果指纹确实匹配,根据你使用的哈希函数而言,已经相当有把握找到了目标。但这并非百分之百确定。唯一确定的方法是进一步调查:(i)他/她是否有机会/动机,(ii)证人等等。
当您使用计算机时,如果两个对象具有相同的哈希码值,则您需要进一步调查它们是否真正相等。例如,您必须检查对象是否具有相同的高度、重量等,如果整数相同,或者如果客户ID匹配,然后得出结论它们是否相同。这通常通过实现IComparer或IEquality接口来完成。
关键摘要
基本上,哈希码就是指纹。
理解以上内容可能需要一些时间,建议多读几遍直到完全理解。
MSDN表示:
哈希码是用于在等式测试期间标识对象的数字值。 它还可以作为集合中对象的索引。
GetHashCode方法适用于哈希算法和数据结构(如哈希表)。
GetHashCode方法的默认实现不保证对于不同对象返回唯一值。此外,.NET Framework不保证GetHashCode方法的默认实现,它返回的值将在.NET Framework的不同版本之间相同。因此,不能将此方法的默认实现用作用于哈希目的的唯一对象标识符。
派生类型可以重写GetHashCode方法。 值类型必须覆盖此方法以提供适用于该类型的哈希函数,并在哈希表中提供有用的分布。 对于唯一性,哈希码必须基于实例字段或属性的值而不是静态字段或属性。
在Hashtable对象中用作键的对象也必须重写GetHashCode方法,因为这些对象必须生成自己的哈希码。 如果用作键的对象不提供有用的GetHashCode实现,则可以在构造Hashtable对象时指定哈希码提供程序。 在.NET Framework版本2.0之前,哈希码提供程序基于System.Collections.IHashCodeProvider接口。 从版本2.0开始,哈希码提供程序基于System.Collections.IEqualityComparer接口。
基本上,哈希码存在是为了使哈希表成为可能。
两个相等的对象保证具有相等的哈希码。
两个不相等的对象不能保证具有不相等的哈希码(这称为冲突)。
GetHashCode()
用于支持将对象作为哈希表的键。 (Java等中也存在类似的东西)。目标是让每个对象返回不同的哈希码,但这通常无法绝对保证。 但是,必须确保两个逻辑上相等的对象返回相同的哈希码。
典型的哈希表实现从hashCode值开始,取模(因此将该值限制在一个范围内),并将其用作指向“桶”数组的索引。
这不仅适用于WP7,而是所有.Net对象都存在的问题。它会做你所描述的事情,但我不建议您在应用程序中将其作为唯一标识符,因为它不能保证是唯一的。