如何使用 System.HashCode.Combine 超过 8 个值?

How to use System.HashCode.Combine with more than 8 values?

.NET Standard 2.1 / .NET Core 3 introduce System.HashCode 可快速将字段和值组合成哈希码,而无需关心底层实现。

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

我是否应该简单地将两个 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 所以你可以在一行中完成所有这些,但可能有一些原因我没有很快想到这一点.

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