.Net Framework 中的 HashCode 等效项

swc*_*aft 3 .net-framework-version .net-core

在将 .NET Core 项目转换为 .NET Framework 时,需要注意的一件事是使用哈希码现在需要转换为等效的内容。可以看出,Hashcode 特定于 .NET core 版本和一些扩展。

https://learn.microsoft.com/en-us/dotnet/api/system.hashcode?view=dotnet-plat-ext-3.1
Run Code Online (Sandbox Code Playgroud)

想知道如果有任何内置对象类型,那么 .NET Framework 中的用法是否足够接近。

Eri*_*oen 6

编辑:

System.HashCode.NET Core 中也可用。您可以用于HashCode.Combine此目的,请参阅:https://learn.microsoft.com/en-us/dotnet/api/system.hashcode ?view=netcore-2.1

var combined = HashCode.Combine("one", "two");
Run Code Online (Sandbox Code Playgroud)

(下面是之前的答案)

长而彻底的答案可以在这里找到:https ://stackoverflow.com/a/34006336/25338

如果您只想要一个简单的答案,您可以将对象哈希组合到一个新的结构(元组、匿名类等)中,然后调用GetHashCode()结果。

例如

public override int GetHashCode() {
    return new { MyField1, MyField2 }.GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)

详细说明上面链接的答案,如果您想让它更容易(?),您当然可以创建一个通用的静态帮助器类来为您完成工作:

 public class MyHashCode
    {
        public static int Hash(params object[] values)
            => CustomHash(1009, 9176, values.Select(v => v.GetHashCode()).ToArray());

        // From answer https://stackoverflow.com/a/34006336/25338
        public static int CustomHash(int seed, int factor, params int[] vals)
        {
            int hash = seed;
            foreach (int i in vals)
            {
                hash = (hash * factor) + i;
            }
            return hash;
        }
    }
Run Code Online (Sandbox Code Playgroud)

并这样称呼它:

  public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            string s1 = "yezz";
            string s2 = "nope";


            var hash = Utils.MyHashCode.Hash(s1, s2);
        }
    }
Run Code Online (Sandbox Code Playgroud)