我注意到WP7中的每个控件都有一个getHashCode()
方法,它返回一个数字序列。我可以使用此哈希码来识别项目吗?例如,我想识别设备中的图片或歌曲,并将其检查到哪里。如果为特定项目提供的哈希码是唯一的,则可以这样做。
你能帮我解释一下hashCode和getHashCode()
用于什么?
答案 0 :(得分:176)
在了解了它的全部内容之后,我想通过类比写出一个希望更简单的解释:
想想Hashcode,因为我们试图独特地识别某人
我是一名侦探,正在寻找一名罪犯。让我们称他为克鲁尔先生。 (当我还是个孩子的时候,他是一个臭名昭着的凶手 - 他闯进了一所被绑架的房子,谋杀了一个可怜的女孩,甩了她的尸体,而他还是松散的 - 但这是一个单独的事情)。克鲁尔先生有一些特殊的特征,我可以用来在人群中独一无二地识别他。我们在澳大利亚有2500万人。其中一位是克鲁尔先生。我们怎么能找到他?
识别克鲁尔先生的不良方式
显然克鲁尔先生有蓝眼睛。这并没有多大帮助,因为澳大利亚近一半的人口也有蓝眼睛。识别克鲁尔先生的好方法
我还能用什么?我知道:我会用指纹!
优点:
上述特性通常会产生良好的散列函数。
那么'碰撞的交易是什么?
想象一下,如果我找到了领导者,我找到了匹配克鲁尔先生指纹的人。这是否意味着我找到了克鲁尔先生?
........也许!我必须仔细看看。如果我使用SHA256(散列函数)而且我正在一个只有5个人的小镇看 - 那么我很有可能找到他!但是,如果我使用MD5(另一种着名的散列函数)并在一个+2 ^ 1000人的城镇中检查指纹,那么两个完全不同的人可能具有相同的指纹是相当好的可能性。
那么这一切的好处是什么呢?
哈希码的唯一真正好处是,如果你想在哈希表中放置一些东西 - 并且你想要快速找到对象的哈希表 - 以及哈希码所在的位置。允许您快速查找哈希表中的内容。这是一次大规模提高性能的黑客攻击,但准确性很低。
因此,让我们想象一下,我们有一个充满人的哈希表 - 澳大利亚有2500万嫌犯。克鲁尔先生在那里的某个地方.....我们如何才能真正找到他 ?我们需要对它们进行整理:寻找潜在的匹配,或者以其他方式宣告潜在的嫌疑人。你不想考虑每个人的独特特征,因为这需要花费太多时间。你会用什么呢?您使用哈希码!哈希码可以告诉您两个人是否不同。 Joe Bloggs是不是克鲁尔先生。如果印刷品不匹配,那么你知道它绝对不是克鲁尔先生。但是,如果指纹匹配,那么根据你使用的哈希函数,你找到你的男人的机会已经相当不错了。但它不是100%。您可以确定的唯一方法是进一步调查:(i)他/她是否有机会/动机,(ii)证人等等。
如果您使用计算机,如果两个对象具有相同的哈希码值,那么您还需要进一步调查它们是否真正相等。例如您必须检查对象是否具有例如如果整数相同,或者如果customer_id匹配,则相同的高度,相同的权重等,然后得出它们是否相同的结论。这通常可以通过实现IComparer或IEquality接口来完成。
主要摘要
所以基本上哈希码是指纹。
要花好3分钟才能绕过上面。或许阅读几次直到它有意义。我希望这对某人有所帮助,因为我学到这一切需要很多的悲伤!
答案 1 :(得分:98)
哈希码是用于标识对象的数值 在平等测试期间。它还可以作为对象的索引 在一个集合中。
GetHashCode方法适用于散列算法和 数据结构,如哈希表。
GetHashCode方法的默认实现没有 保证不同对象的唯一返回值。而且, .NET Framework不保证默认的实现 GetHashCode方法,它返回的值将是相同的 不同版本的.NET Framework。因此,默认 不得将此方法的实现用作唯一对象 用于散列目的的标识符。
GetHashCode方法可以被派生类型覆盖。值 类型必须覆盖此方法以提供哈希函数 适合该类型并在a中提供有用的分布 哈希表。为了唯一性,哈希码必须基于值 实例字段或属性而不是静态字段或 属性。
在Hashtable对象中用作键的对象也必须覆盖 GetHashCode方法因为那些对象必须生成自己的哈希 码。如果用作键的对象不提供有用的 实现GetHashCode,您可以指定哈希码提供程序 何时构造Hashtable对象。在.NET Framework之前 版本2.0,哈希代码提供程序基于 System.Collections.IHashCodeProvider接口。从版本开始 2.0,哈希码提供程序是基于 System.Collections.IEqualityComparer接口。
基本上,存在哈希码以使哈希表成为可能 保证两个相等的对象具有相同的哈希码 两个不相等的对象不保证具有不相等的哈希码(称为冲突)。
答案 2 :(得分:11)
GetHashCode()
用于帮助支持将对象用作哈希表的键。 (类似的东西存在于Java等中)。目标是每个对象返回一个不同的哈希码,但这通常不能绝对保证。虽然两个逻辑上相等的对象返回相同的哈希码,但必需。
典型的哈希表实现以hashCode值开始,取模数(从而将值约束在一个范围内)并将其用作“桶”数组的索引。
答案 3 :(得分:8)
它不是WP7独有的 - 它出现在所有.Net对象上。它有点像你描述的那样,但我不推荐它作为你的应用程序中的唯一标识符,因为它不能保证是唯一的。
答案 4 :(得分:4)
这是来自msdn文章:
https://blogs.msdn.microsoft.com/tomarcher/2006/05/10/are-hash-codes-unique/
"虽然您会听到人们说哈希码为给定输入生成唯一值,但事实是,虽然很难完成,但找到两个不同的哈希数据输入在技术上是可行的相同的值。但是,关于散列算法有效性的真正决定因素在于生成的哈希码的长度以及被散列的数据的复杂性。"
因此,只需使用适合您的数据大小的哈希算法,它就会有唯一的哈希码。