【问题标题】:HashCode equivalent in .Net Framework.Net Framework 中的 HashCode 等效项
【发布时间】:2020-04-01 06:15:00
【问题描述】:

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

https://docs.microsoft.com/en-us/dotnet/api/system.hashcode?view=dotnet-plat-ext-3.1

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

【问题讨论】:

  • 它是 .NET Core 特有的结构,你可以用旧式的GetHashCode() 实现替换

标签: .net-core .net-framework-version


【解决方案1】:

编辑:

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

var combined = HashCode.Combine("one", "two");

(之前的答案如下)

详细的答案可以在这里找到:https://stackoverflow.com/a/34006336/25338

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

例如

public override int GetHashCode() {
    return new { MyField1, MyField2 }.GetHashCode();
}

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

 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;
        }
    }

然后这样称呼它:

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


            var hash = Utils.MyHashCode.Hash(s1, s2);
        }
    }

【讨论】:

  • 还有一个问题,您将如何覆盖以前在 .net 核心项目的几个不同类中调用的所有 GetHashCode() 方法?你会创建一个 HashCode 类并在那里做吗?
  • 好问题,你当然可以。但你会怎么称呼它?写出来的代码会更少吗?或者该类中是否存在您不想复制的任何其他共享逻辑?你对那个类的签名有什么建议吗?你会怎么称呼它?你当然可以创建一个静态的MyHashCode.GetHashCode(params object[] values),但是你如何动态地创建一个匿名对象呢?
  • 但否则我需要覆盖 10+ 类 GetHashCode() ,除非它们都继承自我创建的具有抽象方法的某个基类,或者可以覆盖某些东西。我考虑过,但不喜欢任何一种方式。欢迎任何更好的想法。
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 2020-09-21
  • 2010-09-21
  • 1970-01-01
  • 2010-09-20
  • 2010-10-19
  • 2011-12-22
相关资源
最近更新 更多