我注意到getHashCode()
WP7中的每个控件,项目都有一个方法,该方法返回一个数字序列。我可以使用该哈希码来识别商品吗?例如,我想识别设备中的图片或歌曲,并检查其位置。如果为特定项目指定的哈希码是唯一的,则可以执行此操作。
您能帮我解释一下hashCode及其getHashCode()
用途吗?
我注意到getHashCode()
WP7中的每个控件,项目都有一个方法,该方法返回一个数字序列。我可以使用该哈希码来识别商品吗?例如,我想识别设备中的图片或歌曲,并检查其位置。如果为特定项目指定的哈希码是唯一的,则可以执行此操作。
您能帮我解释一下hashCode及其getHashCode()
用途吗?
Answers:
哈希码是一个数值,用于在相等性测试期间标识对象。它也可以用作集合中对象的索引。
GetHashCode方法适用于哈希算法和数据结构(例如哈希表)。
GetHashCode方法的默认实现不能保证不同对象的唯一返回值。此外,.NET Framework不保证GetHashCode方法的默认实现,并且它返回的值在.NET Framework的不同版本之间将相同。因此,不得将此方法的默认实现用作哈希目的的唯一对象标识符。
GetHashCode方法可以被派生类型覆盖。值类型必须重写此方法,以提供适用于该类型的哈希函数并在哈希表中提供有用的分布。为了唯一,哈希码必须基于实例字段或属性的值,而不是静态字段或属性。
在Hashtable对象中用作键的对象还必须重写GetHashCode方法,因为这些对象必须生成自己的哈希码。如果用作键的对象不能提供GetHashCode的有用实现,则可以在构造Hashtable对象时指定哈希码提供程序。在.NET Framework 2.0版之前,哈希码提供程序基于System.Collections.IHashCodeProvider接口。从2.0版开始,哈希码提供程序基于System.Collections.IEqualityComparer接口。
基本上,存在哈希码以使哈希表成为可能。
保证两个相等的对象具有相等的哈希码。不保证
两个不相等的对象具有不相等的哈希码(称为冲突)。
了解了所有内容之后,我想通过类比写一个希望更简单的解释:
请阅读以下详细信息:
当我们尝试唯一识别某人时,请考虑一个哈希码
我是一名侦探,正在寻找犯罪分子。让我们称他为克鲁尔先生。(当我还是个孩子的时候,他是一个臭名昭著的杀人犯–他闯入一所被绑架的房子,谋杀了一个可怜的女孩,丢下了她的尸体,但他仍然处于松散状态-但这是另一回事。)克鲁尔先生具有某些独特的特征,我可以用来在人海中独特地识别他。我们在澳大利亚有2500万人。克鲁尔先生就是其中之一。我们怎么能找到他?
识别残酷先生的坏方法
显然,克鲁尔先生是蓝眼睛的。这没有太大帮助,因为澳大利亚几乎一半的人口也有蓝眼睛。
识别克鲁尔先生的好方法
我还能使用什么?我知道:我会使用指纹!
优点:
上述特征通常构成良好的哈希函数。
那么“碰撞”有什么用呢?
因此,想象一下,如果我获得了领先,并且找到了匹配克鲁尔先生指纹的人。这是否意味着我找到了克鲁尔先生?
........也许!我必须仔细看看。如果我使用的是SHA256(哈希函数),而我正在一个只有5个人的小镇上看-那么我很有可能找到他!但是,如果我使用MD5(另一种著名的哈希函数)并在拥有+ 2 ^ 1000个人的城镇中检查指纹,那么两个完全不同的人可能拥有相同的指纹是一个相当好的可能性。
那么,这一切的好处是什么?
哈希码的唯一真正好处是,如果您想将某些东西放入哈希表中-并且希望使用哈希表快速查找对象-那就是哈希码的所在。它们使您可以真正在哈希表中查找内容很快。这是一种可大幅提高性能的黑客工具,但准确性却有所降低。
因此,让我们想象一下,我们有一个充满了人们的哈希表-澳大利亚有2500万嫌疑犯。克鲁尔先生在那儿某处.....我们怎么能很快找到他?我们需要对它们全部进行排序:找到潜在的匹配项,或者以其他方式宣判无罪的嫌疑人。您不想考虑每个人的独特特征,因为这将花费太多时间。您将使用什么呢?您将使用哈希码!哈希码可以告诉您两个人是否不同。无论Joe Bloggs是否不是Cruel先生。如果印刷品不符,那您肯定不是克鲁尔先生。但是,如果指纹确实匹配然后根据您使用的哈希函数,找到您的男人的机会已经相当不错了。但这不是100%。您可以确定的唯一方法是进一步调查:(i)他/她是否有机会/动机,(ii)证人等。
当您使用计算机时,如果两个对象具有相同的哈希码值,则再次需要进一步调查它们是否真正相等。例如,您必须检查对象是否具有相同的高度,相同的重量等,是否整数相同,或者customer_id是否匹配,然后得出结论是否相同。这通常可以通过实现IComparer或IEquality接口来完成。
关键摘要
因此,基本上,哈希码是指纹。
您需要花费3分钟的时间才能解决上述问题。也许读几次直到有道理。我希望这对某人有帮助,因为我花了很多时间才学会了这一切!
它不是WP7独有的-它存在于所有.Net对象中。它确实可以满足您的描述,但我不建议您将其作为应用程序中的唯一标识符,因为不能保证它是唯一的。
这来自msdn文章:
https://blogs.msdn.microsoft.com/tomarcher/2006/05/10/are-hash-codes-unique/
“虽然您会听到人们说哈希码会为给定的输入生成唯一值,但事实是,虽然很难实现,但找到两个哈希值都相同的数据输入在技术上是可行的。决定散列算法有效性的因素在于所产生的散列码的长度和被散列数据的复杂性。”
因此,只需使用适合您数据大小的哈希算法,它将具有唯一的哈希码。