【问题标题】:Why does the `System.String.GetHasCode` return different values once I rerun my app?为什么在我返回我的应用程序后,`System.String.GetHashCode` 返回不同的值?
【发布时间】:2019-11-24 12:25:57
【问题描述】:

为什么System.String.GetHasCode 在我重新运行我的应用后返回不同的值?

例如我有应用程序:

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# 的引用,我们有以下约定:

具有相同值的对象应该返回相同的代码。例如,两个 String 对象 使用相同的文本应该返回相同的哈希码值。

引用中没有关于应用程序仅运行一次的信息。 IE。我对我的案例的引用理解如下:如果两个字符串的值相等,那么即使在应用程序重新运行后哈希码也应该相等。

【问题讨论】:

    标签: .net string hash clr implementation


    【解决方案1】:

    GetHashCode 的结果可能取决于实现,并且不保证在多个版本或平台上相同。出于安全考虑,.NET Core 实现使用了一种称为“随机字符串散列”的功能,它为每个应用程序运行创建不同的散列值。

    来自the documentation(我强调):

    不保证哈希码本身是稳定的。对于单个 .NET 版本,相同字符串的哈希码在 .NET 实现、.NET 版本以及 .NET 平台(例如 32 位和 64 位)之间可能会有所不同。在某些情况下,它们甚至可能因应用程序域而异。 这意味着同一程序的两次后续运行可能会返回不同的哈希码。

    在同一个应用程序运行中结果仍然稳定,在这个例子中你会看到三个相等的数字:

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

    【讨论】:

      猜你喜欢
      • 2021-04-19
      • 2021-12-25
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 2021-05-24
      • 1970-01-01
      • 2020-05-07
      相关资源
      最近更新 更多