我想根据要搜索的对象和一些搜索设置缓存一些搜索结果。

然而:这会创建一个很长的缓存键,我想我会为它创建一个快捷方式,我想我会使用 GetHashCode()

所以我想知道,即使我的字符串很长或仅此不同,GetHashCode()也会始终生成一个不同的数字吗?

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

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

编辑:如果 MD5 可以工作,我可以更改我的代码以不使用 GetHashCode 当然,目标是获得比原始字符串更短的字符串(> 1000 个字符)

最佳答案

您不能指望 GetHashCode() 是唯一的。

有一篇出色的文章调查了http://kenneththorman.blogspot.com/2010/09/c-net-equals-and-gethashcode.html上可能发生的碰撞的可能性。调查结果是“调用 GetHashCode() 为不同字符串返回相同哈希码的最少次数是在 565 次迭代之后,而在发生哈希码冲突之前的最高迭代次数是 296390 次迭代。”

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

散列函数必须具有以下属性:

  • 如果两个对象比较相等,则每个对象的 GetHashCode 方法必须返回相同的值。但是,如果两个对象不相等,则两个对象的 GetHashCode 方法不必返回不同的值。
  • 只要没有修改确定对象的Equals方法返回值的对象状态,对象的GetHashCode方法就必须一致地返回相同的哈希码。请注意,这仅适用于应用程序的当前执行,如果再次运行该应用程序,可能会返回不同的哈希码。
  • 为获得最佳性能,散列函数必须为所有输入生成随机分布。

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

    关于c# - 我可以将 GetHashCode() 用于所有字符串比较吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12366828/

    10-15 09:21