为什么 `System.String.GetHasCode` return 在我重新运行我的应用程序后会出现不同的值?

Why does the `System.String.GetHasCode` return different values once I rerun my app?

为什么 System.String.GetHasCode return 在我重新 运行 我的应用程序后会有不同的值?

例如我有应用程序:

using System;

namespace myprogram
{
    class Program {
        static void Main(string[] args) {
           Console.WriteLine("foo".GetHashCode());
        }
    }
}

我 运行 应用程序两次并获得不同的输出:

user@user MINGW64 /c/Projects/dotNet/Console.NET
$ dotnet run
1430600909

user@user MINGW64 /c/Projects/dotNet/Console.NET
$ dotnet run
208120252

这是否意味着 System.String.GetHasCode 在 .NET Core 中的实现不正确?因为根据来自 CLR via C# 的引用,我们有以下约定:

Objects with the same value should return the same code. For example, two String objects with the same text should return the same hash code value.

该应用程序在引用中只 运行 一次。 IE。我理解对我的案例的引用如下:如果两个字符串的值相等,那么即使在应用程序 re运行.

之后哈希码也应该相等

GetHashCode 的结果可能取决于实现,并且不保证在多个版本或平台上是相同的。出于安全目的,.NET Core 实现使用称为 "randomized string hashing" 的功能,它为每个应用程序创建不同的哈希值 运行.

来自the documentation(我强调):

The hash code itself is not guaranteed to be stable. Hash codes for identical strings can differ across .NET implementations, across .NET versions, and across .NET platforms (such as 32-bit and 64-bit) for a single version of .NET. In some cases, they can even differ by application domain. This implies that two subsequent runs of the same program may return different hash codes.

结果在同一应用程序中仍然稳定 运行,在此示例中,您将看到打印了三个相等的数字:

using System;

public class Program
{
    public static void Main()
    {
        Console.WriteLine("foo".GetHashCode());
        Console.WriteLine("foo".GetHashCode());
        Console.WriteLine("foo".GetHashCode());
    }
}