我可以使用GetHashCode()进行所有字符串比较吗?

Mic*_*hel 3 c# hashcode

我想基于要搜索的对象和一些搜索设置来缓存一些搜索结果.

但是:这会创建相当长的缓存键,我想我会为它创建一个快捷方式,我想我会用GetHashCode()它.

所以我想知道,GetHashCode()总是产生一个不同的数字,即使我有很长的字符串或只有这个不同:'ä'而不是'a'

我尝试了一些字符串,似乎答案是肯定的,但不理解这种GetHashCode()行为并没有给我真正的感觉,我是对的.

而且因为当你没有准备好时(客户端正在查看错误搜索的缓存结果),它会弹出一些东西,我想确定...

编辑:如果MD5可以工作,我可以改变我的代码不使用GetHashCode ofcourse,目标是得到一个短的(呃)字符串比原来(> 1000字符)

sma*_*man 8

你不能指望GetHashCode()独一无二.

http://kenneththorman.blogspot.com/2010/09/c-net-equals-and-gethashcode.html上有一篇很好的文章可以调查碰撞的可能性.调查结果是"GetHashCode()调用不同字符串返回相同哈希码的最小次数是在565次迭代之后,获得哈希码冲突之前的最大迭代次数是296390次迭代."

为了使您能够理解实现合同GetHashCode,以下是MSDN文档的摘录Object.GetHashCode():

哈希函数必须具有以下属性:

  • 如果两个对象比较相等,则每个对象的GetHashCode方法必须返回相同的值.但是,如果两个对象的比较不相等,则两个对象的GetHashCode方法不必返回不同的值.

  • 只要没有对对象状态的修改来确定对象的Equals方法的返回值,对象的GetHashCode方法必须始终返回相同的哈希代码.请注意,这仅适用于当前应用程序的执行,并且如果再次运行应用程序,则可以返回不同的哈希代码.

  • 为获得最佳性能,哈希函数必须为所有输入生成随机分布.

C#编译器团队的Eric Lippert GetHashCode在他的博客http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/上解释了实施规则的基本原理.

  • @JesseJames以及如何通过`GetHashCode`的`Int32`返回值返回MD5哈希的128位(64字节)大小.除了MD5可能也不是唯一的事实,并且计算它可能比简单地比较字符串本身更糟糕. (4认同)

Mot*_*tti 8

逻辑上GetHashCode 不能是唯一的,因为只有2 ^ 32个整数和无限数量的字符串(参见鸽子孔原理).


正如@Henk在评论中指出的那样,即使存在无限数量的字符串,也存在有限数量的System.Strings.然而,鸽子洞的原则仍然存在,因为后者远远大于int.MaxValue.

  • 字符串长度有一个限制,因此也没有无限数量的字符串.但是这个数字比2 ^ 32大几个数量级,是的. (2认同)