2个不同的字符串可以在C#中使用相同的哈希码吗?

时间:2012-10-26 19:13:36

标签: c# string

  

可能重复:
  what is hashCode use for? is it unique?

我生成了很多字符串,然后我的问题是:

2个不同的字符串可以在C#中使用相同的哈希码吗?

哈希码我的意思是:

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

我的问题更多的是关于C#遵循的算法来生成字符串,也许是 当所有其他哈希码已生成或可能不生成时,会发生冲突。 有可能有人有这个答案。

4 个答案:

答案 0 :(得分:19)

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

具有相同哈希码的两个不同的字符串(或任何值)被称为“冲突”。良好的散列算法将尝试确保尽可能最小化冲突(尽管它们无法消除)。通常这取决于实际中的实际数据类型;在这种字符串的情况下,这意味着相似或相似大小的字符串应该(理想情况下)不易发生冲突。

我假设你问,因为你正在考虑使用字符串的哈希码作为字符串的唯一标识符。 Don't do that

如果您有兴趣,

Here是一个关于哈希码更详细的链接。

答案 1 :(得分:5)

一般情况下,如果元素的数量与哈希空间大小的平方根http://en.wikipedia.org/wiki/Birthday_problem

一样多,则应该会发生哈希冲突

对于32位散列,您应该期望第一次碰撞65k元素。 这当然是统计学的,所以你无法确切地预测它何时会发生,但它对于直觉是有用的。如果你有10个字符串,你可能不需要担心碰撞,如果你肯定有100k。

答案 2 :(得分:1)

这取决于散列函数以及它使用的算法。

通常,一些散列技术可以将一个输入(您想要散列的值)映射到一个输出(散列值),而其他散列技术可以将两个不同的输入映射到同一输出,后者称为碰撞{{3 }}

例如,如果哈希函数将100个用户的名称编码为0-9,我们就会发生很多冲突。

返回GetHashCode();

请参阅MSDN上的这两篇文章:

http://en.wikipedia.org/wiki/Collision_(computer_science)

这个解释了这个功能,这里是它底部的引用,检查第一个项目:

  
    

GetHashCode只能做一件事:平衡哈希表。不要将它用于其他任何事情。特别是:

  
     
      
  • 它不为对象提供唯一键;碰撞概率极高。
  •   
  • 它不具有加密强度,因此请勿将其用作数字签名或密码等效项的一部分
  •   
  • 它不一定具有校验和所需的错误检测属性。
  •   

以下是更多解释:

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

答案 3 :(得分:0)

简单的答案是“是”。使用哈希码,您总是有碰撞的可能性。