2012-10-26 34 views
3

可能重复:
what is hashCode use for? is it unique?可以2个不同的字符串在C#中具有相同的哈希码吗?

我产生了很多的字符串,那么我的问题是:

可以在2个不同的字符串在C#相同的散列码?

通过哈希码我的意思是:

string s = "Hello"; 
s.GetHashCode(); 

我的问题是更多关于C#遵循geneate琴弦的算法,也许 碰撞来时,已经或可能不会产生其他所有的哈希码。 有人可能有这个答案。

+1

......是的...... –

+1

一切都可以有相同的散列码,因为它们是有限的。 –

+0

是的,这就是为什么像对象的字符串,它可以有更多的组合比潜在的散列数,一旦你找到两个对象具有相同的散列,你必须以旧的标准方式比较它们,以确保它们是不会碰撞。 – LightStriker

回答

19

是的。散列码不是唯一的。有2^32(4,294,967,296)可能的散列码(32位整数中的每个整数值)。实际上有无数的可能的字符串。显然,无限数量的字符串中的每一个都不可能有不同数量的有限数字。

具有相同散列码的两个不同字符串(或任何值)被称为“冲突”。一个好的散列算法将尽力确保最大限度地减少冲突(尽管它们不能被消除)。通常这将取决于实际数据的实际类型;在这种情况下,这意味着相似或相似大小的字符串应该(理想情况下)不易碰撞。

我假定你问的是因为你正在考虑使用字符串的散列码作为字符串的唯一标识符。 Don't do that

Here是一个链接,通常会更详细地讨论哈希码,如果您有兴趣的话。

+0

只有2^2^30字符串左右:P – CodesInChaos

+0

@CodesInChaos现在快乐吗? – Servy

+0

我挑战你的断言,说有无数可能的字符串。 –

0

简单的答案是“是”。使用散列码您总是有碰撞的机会。

5

一般来说,你应该期待一个哈希冲突,一旦你有尽可能多的元素作为哈希空间http://en.wikipedia.org/wiki/Birthday_problem

的大小对于32位散列的平方根,你应该会围绕65000元的第一次碰撞。 这当然是统计学的,所以你不能准确预测什么时候会发生,但它对直觉有用。如果你有10个字符串,你可能不需要担心碰撞,如果你肯定有100k的话。

+0

或者是不吉利,并且将它组合得少得多。这都是关于运气。 – LightStriker

+0

概率并不重要。 Pigeonhole原则允许更好的论证。 – delnan

+0

@delnan概率问题。例如,一个加密的256位散列存在冲突,但是您可以依靠这种事情永远不会发生的事实来编写软件。 – CodesInChaos

1

它取决于散列函数以及它正在使用的算法。一般来说,一些哈希技术可以将一个输入(您想要哈希的值)映射到一个输出(散列值),而另一些可以将两个不同的输入映射到同一输出,后者称为碰撞http://en.wikipedia.org/wiki/Collision_(computer_science)

例如,如果一个哈希函数将100个用户的名字编码为0-9,我们会碰到很多碰撞。

回到GetHashCode();

参考这两篇文章在MSDN:

http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/

这一个解释的功能,这里是它的底部报价,查询的第一发子弹:

GetHashCode被设计为只做一件事:平衡散列表。不要用它来做其他事情。特别是:

  • 它不提供用于对象的唯一密钥;碰撞概率非常高。
  • 它不具有加密强度,因此不要将其用作数字签名或等同密码的一部分
  • 它不一定具有校验和所需的错误检测属性。

这里有更多的解释:

http://blogs.msdn.com/b/ericlippert/archive/2010/03/22/socks-birthdays-and-hash-collisions.aspx

相关问题