C#string literal GetHashCode()在给定上下文中的计算结果是否不同?

C#string literal GetHashCode()在给定上下文中的计算结果是否不同?,c#,hashcode,C#,Hashcode,因此,我有一些代码失败了,因为两个字符串文本具有可以计算为相同值的哈希代码。虽然我理解碰撞可能发生,但我并没有完全预料到这一点。但在调试代码中的一个问题时,我和一位同事发现,如果我们这样做了,会立即出现一个窗口 "55d02ProductAd".GetHashCode() == "55b0tProductAd".GetHashCode() 它将求值为true。不理想,但也不是不可能。当我们向另一位同事描述这一点时,他难以置信地编写了一个scratch程序 var h1 = "55d02Prod

因此,我有一些代码失败了,因为两个字符串文本具有可以计算为相同值的哈希代码。虽然我理解碰撞可能发生,但我并没有完全预料到这一点。但在调试代码中的一个问题时,我和一位同事发现,如果我们这样做了,会立即出现一个窗口

"55d02ProductAd".GetHashCode() == "55b0tProductAd".GetHashCode()
它将求值为
true
。不理想,但也不是不可能。当我们向另一位同事描述这一点时,他难以置信地编写了一个scratch程序

var h1 = "55d02ProductAd".GetHashCode();
var h2 = "55b0tProductAd".GetHashCode();
Console.WriteLine(h1 == h2);

在上述情况下,它们的评估结果并不相同。我们的监视器相邻,我们对不同的输出感到困惑。有什么想法吗?

散列代码仅在合同上有义务为单个应用程序执行的上下文中的值生成相同的散列。由于您正在比较来自完全不同的应用程序的
GetHashCode
的值,因此没有义务要求它们相等。

散列代码仅在合同上有义务在单个应用程序执行的上下文中为值生成相同的散列。由于您正在比较来自完全不同的应用程序的
GetHashCode
的值,因此没有义务要求它们相等。

您不应该在创建哈希代码的应用程序域之外保留或使用哈希代码,因为同一对象可能会在应用程序域、进程、,和平台。
它们至少在.net 4.5 1中有相同的哈希代码。在同一台机器上执行这两种操作-不同的机器可能会产生不同的哈希值。2.这两者在我的机器上都是真的。永远不要使用哈希代码来表示相等。哈希代码不是唯一的。@即使在同一台计算机上,也允许生成不同的哈希。相关:
您不应在创建哈希代码的应用程序域之外保留或使用哈希代码,因为同一对象可能会在应用程序域、进程、进程之间哈希,和平台。
它们至少在.net 4.5 1中有相同的哈希代码。在同一台机器上执行这两种操作-不同的机器可能会产生不同的哈希值。2.这两者在我的机器上都是真的。永远不要使用哈希代码来表示相等。哈希代码不是唯一的。@rick即使在同一台机器上,也可以生成不同的哈希。相关:他并不是说他在比较不同应用程序的值。他说一个应用程序产生不同的值。@Stillgar不,他不是。他说他有一个应用程序,计算了这些散列,然后一个同事创建了一个新的应用程序,散列了相同的字符串,得到了不同的值。这是一个完全不同的应用程序。当然,即使它是同一个应用程序,如果它是对它的不同调用,散列也可以改变。如果你只是打印“Hello World!”的散列并反复运行它,它就可以给出一个不同的值。此外,冲突也相当常见。许多依赖哈希代码的结构(如
字典
)都能优雅地处理冲突。@Haney,任何不依赖哈希代码的结构都有缺陷。每个合理的实现都需要处理冲突。@Haney合理的处理不是使用哈希来确定相等,而是不相等。在同一个应用领域中,从匹配算法中排除某些东西确实是一种简单的方法。他并不是说他在比较不同应用程序的值。他说一个应用程序产生不同的值。@Stillgar不,他不是。他说他有一个应用程序,计算了这些散列,然后一个同事创建了一个新的应用程序,散列了相同的字符串,得到了不同的值。这是一个完全不同的应用程序。当然,即使它是同一个应用程序,如果它是对它的不同调用,散列也可以改变。如果你只是打印“Hello World!”的散列并反复运行它,它就可以给出一个不同的值。此外,冲突也相当常见。许多依赖哈希代码的结构(如
字典
)都能优雅地处理冲突。@Haney,任何不依赖哈希代码的结构都有缺陷。每个合理的实现都需要处理冲突。@Haney合理的处理不是使用哈希来确定相等,而是不相等。在同一个应用程序域中,这确实是一种从匹配算法中排除内容的简单方法。