.net 字符串对象的GetHashCode()值是否唯一?

.net 字符串对象的GetHashCode()值是否唯一?,.net,string,unique,hashcode,.net,String,Unique,Hashcode,有人能帮我理解GetHashCode()方法是如何处理字符串值的吗 我发现: 如果两个字符串对象相等,则GetHashCode方法返回相同的值。但是,对于每个唯一的字符串值,没有唯一的哈希代码值。不同的字符串可以返回相同的哈希代码 因此,不同的字符串可以返回相同的哈希代码,,哈希代码对于字符串不是唯一的。它会导致程序核心出现bug吗?如果您假设匹配的哈希代码意味着匹配的字符串,那么它会导致bug。通常,使用哈希代码将字符串排序到存储桶中,以便快速搜索和选择。如果检测到两个字符串具有匹配的哈希代码

有人能帮我理解GetHashCode()方法是如何处理字符串值的吗

我发现:

如果两个字符串对象相等,则GetHashCode方法返回相同的值。但是,对于每个唯一的字符串值,没有唯一的哈希代码值。不同的字符串可以返回相同的哈希代码


因此,不同的字符串可以返回相同的哈希代码,,哈希代码对于字符串不是唯一的。它会导致程序核心出现bug吗?

如果您假设匹配的哈希代码意味着匹配的字符串,那么它会导致bug。通常,使用哈希代码将字符串排序到存储桶中,以便快速搜索和选择。如果检测到两个字符串具有匹配的哈希代码,则通常会比较字符串本身是否相等


如果这不能回答您的问题,那么我不理解这个问题。

如果您的算法依赖于每个字符串具有唯一的哈希值,那么这可能会导致错误

例如,哈希映射(.NET中的字典)可能会因冲突而失败(即两个具有相同哈希且不相等的对象),或者如果它处理冲突则不会失败,这取决于具体的实现。在这种情况下失败意味着:如果将新对象添加到映射中,并且映射中已有一个对象与新对象具有相同的哈希值,那么新对象将覆盖旧对象,而不仅仅是添加。据我所知,.NET中的Dictionary类可以处理冲突

如果你需要更具体的建议,你需要问一个更具体的问题:你想归档什么,你打算如何归档等等

作为旁注:字符串的哈希值通常不是唯一的,因为哈希值的大小是有限的,而字符串的长度不是唯一的。可以这样想:假设散列函数是MD5(它不是.Net中的默认值),并且您有一个由十六进制dec字符(0-9A-Z)组成的字符串,该字符串长度为200个字符:该字符串有200^16个可能值,但其散列值只有32^16个可能值

因此,不同的字符串可以返回相同的哈希代码,哈希代码对于字符串不是唯一的。它会导致程序核心出现错误吗

如果哈希值按预期使用,则不会导致错误。
GetHashCode()
返回的哈希并不打算提供唯一的哈希-这是不可能的,因为只有大约40亿个可能的哈希代码(因为该方法返回的是
Int32
),但可能的字符串数量是无限的


散列旨在提供很少的集合,而不是没有冲突。因此,永远不要假设哈希是基于值的唯一表示。您得到的唯一保证是,两个不同字符串的两个不同哈希代码意味着字符串不相等,因为两个相等的值应始终生成相同的哈希。但是,两个相等的哈希代码并不一定意味着两个字符串值相等。

哈希代码用于加快哈希集合中对象的搜索速度。在内部,它们将对象存储在许多存储桶中。所持有的对象根据其哈希代码划分为多个存储桶。例如,当你打电话时


var值=字典[“someKey”]

字典而不是在所有内部bucket中搜索,直接进入应该包含该键下的值的bucket。字典只在那个桶里搜索

也许这并不完全是它的实现方式,但或多或少应该是这样。
所以在本例中,字典中的不同键具有相同的哈希代码并不重要。这只意味着该键下的值最终将位于同一个bucket中。

实际上,该文档对该方法所做的保证非常准确。哈希代码只遵循以下两条规则(
a==b
a.Equals(b)
#a
a.GetHashCode()
,因为可读性原因):

  • 如果
    a==b
    那么
    a==b
  • 如果
    #a!=#b
    然后
    a!=b

请注意,
Equals
和匹配哈希之间并不等价。如果您依赖的不止这些,那么很明显,您的代码有一个bug
GetHashCode
用于将对象用作字典中的键,这样可以快速地从对象映射到数字,但不需要可逆。如果你看字符串,你很容易就会发现可能的字符串的数量很快就超过了可能的散列码的数量,所以你可以自己回答这个问题。您已经超过了232个可能的字符串,仅两个字符多一点。

谢谢您的回答,David。据我所知,hashcode需要识别对象是不同的,但由于两个对象可能具有相同的hashcode值,这是否意味着将来可能会发生错误?这不是必需的。如果重写相等函数,那么重写哈希值是一种很好的做法,因为您通常希望相等的对象返回相同的哈希值。还有一些东西依赖于此,比如散列图(Dictionary in.NET)@Warlock:我不明白这个问题。两个字符串具有相同的哈希代码,即使它们不完全相同,也不表示有问题。就像两个人有着相同的首字母,但名字不同。好吧,大卫,你说得对。我相信现在一切都在正确的位置上。实际上,哈希代码用于加快对象的搜索速度。我错过了这个细节,这成了一个误会。谢谢你的回答,佩里。这对于理解.Net中的内部流程非常有帮助。我想更深入地了解它,如果你提供文章或书籍的参考资料,我会非常兴奋:)谢谢你,梅恩。这个问题并不具体,因为我还没有真正面对这个问题