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

Eri*_*ura 3 c# string

可能重复:
hashCode用于什么?这是独特的吗?

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

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

通过哈希码我的意思是:

string s = "Hello";
s.GetHashCode();
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*rvy 19

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

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

我假设你问,因为你正在考虑使用字符串的哈希码作为字符串的唯一标识符. 不要那样做.

如果您有兴趣,这里有一个关于哈希码更详细的链接.


Bos*_*ohn 5

一般来说,一旦你拥有与哈希空间大小的平方根一样多的元素,就应该期望哈希冲突http://en.wikipedia.org/wiki/Birthday_problem

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