c# - 如何使用超过 8 个值的 System.HashCode.Combine?

标签 c# hashcode gethashcode

.NET 标准 2.1/.NET 核心 3 introduce System.HashCode 快速将字段和值组合为哈希码,而无需关心底层实现。

但是,它只提供Combine最多 8 个值的方法重载。如果我有一个包含 9 个值(3x3 矩阵)甚至 16 个值(4x4 矩阵)的类,我该怎么办?

我应该简单地加起来两个 Combine调用,在每个调用中传递尽可能多的值?

public override int GetHashCode()
    => HashCode.Combine(M11, M12, M13, M21, M22, M23, M31, M32) + HashCode.Combine(M33);

看着source ,我不能完全争论这是否会产生我不知道的影响。

最佳答案

System.HashCode documentation you actually linked yourself 中所述,只需将连续 Combine 创建的哈希码相加电话是 不是 解决方案。

静态Combine是正确的方法最多只允许 8 个值,但这些似乎只是安慰方法。要组合 8 个以上的值,您必须求助于实例化 HashCode并像这样使用它:

public override int GetHashCode()
{
    HashCode hash = new HashCode();
    hash.Add(M11);
    hash.Add(M12);
    hash.Add(M13);
    hash.Add(M21);
    hash.Add(M22);
    hash.Add(M23);
    hash.Add(M31);
    hash.Add(M32);
    hash.Add(M33);
    return hash.ToHashCode();
}

这确实让我想知道为什么没有 HashCode接受 params object[] values 的构造函数所以你可以在一行中完成所有这些,但可能有一些原因我没有很快想到这一点。

仍然比自己完成所有内部工作要好得多! :-)

关于c# - 如何使用超过 8 个值的 System.HashCode.Combine?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59375124/

相关文章:

c# - 获得对 C# 组件中鼠标点击的访问权限

c# - IIS 7 配置数据库 : Setting the framework version and the managed pipeline mode programmatically

c# - 当参数为 null 时,null 安全哈希码函数返回什么值比较好?

java - 为什么这个 hashCode() 方法被认为很差?

c# - 重写相等运算符

c# - 在 Entity Framework \sqlite 中为实体设置状态以修改的最快方法

c# - 防止最大化的 WPF 窗口覆盖任务栏

java - 为什么 Sun 指定 String.hashCode() 实现?

c# - 关于如何正确覆盖 object.GetHashCode() 的一般建议和指南

c# - 实现正确的 GetHashCode