我正在生成很多字符串,那么我的问题是:
2 个不同的字符串可以在 C# 中具有相同的哈希码吗?
通过哈希码我的意思是:
string s = "Hello";
s.GetHashCode();
我的问题更多的是关于 C# 生成字符串的算法,也许当所有其他哈希码已经生成或者没有生成时,就会发生冲突。可能有人有这个答案。
我正在生成很多字符串,那么我的问题是:
2 个不同的字符串可以在 C# 中具有相同的哈希码吗?
通过哈希码我的意思是:
string s = "Hello";
s.GetHashCode();
我的问题更多的是关于 C# 生成字符串的算法,也许当所有其他哈希码已经生成或者没有生成时,就会发生冲突。可能有人有这个答案。
是的。哈希码不是唯一的。有 2^32 (4,294,967,296) 个可能的哈希码(一个对应于 32 位整数中的每个整数值)。实际上有无数个可能的字符串。显然,无限数量的字符串中的每一个都不可能具有不同数量的有限数。
具有相同哈希码的两个不同字符串(或任何值)称为“冲突”。一个好的散列算法将尝试确保最大限度地减少冲突(尽管它们不能被消除)。这通常取决于实践中的实际数据类型;在这种字符串的情况下,这意味着相似或大小相似的字符串应该(理想情况下)不太容易发生冲突。
我假设您之所以问是因为您正在考虑使用字符串的哈希码作为字符串的唯一标识符。 不要那样做。
如果您有兴趣,这里有一个链接,可以更详细地了解哈希码。
通常,一旦您拥有与散列空间大小的平方根一样多的元素,您应该期望散列冲突http://en.wikipedia.org/wiki/Birthday_problem
对于 32 位散列,您应该期待您的第一次碰撞围绕 65k 元素。这当然是统计的,所以你无法准确预测它何时会发生,但它对直觉很有用。如果你有 10 个字符串,你可能不需要担心碰撞,如果你有 100k,你肯定会担心。
这取决于散列函数以及它使用的算法。
一般来说,一些散列技术可以将一个输入(您要散列的值)映射到一个输出(散列值),而另一些可能会将两个不同的输入映射到同一个输出,后者称为 Collision 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
简单的答案是“是”。使用哈希码,您总是有发生冲突的机会。