How to use System.HashCode.Combine with more than 8 values?
c#, gethashcode, hashcode
Solution
As stated in the `System.HashCode` documentation, adding together hashes returned by successive `HashCode.Combine` calls is NOT the solution.
While the static `HashCode.Combine` method overloads only allow up to 8 values, these are just convenience methods - to combine more, instantiate the `HashCode` class itself and use it as follows:
public override int GetHashCode()
{
HashCode hash = new();
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();
}
It does make me wonder why there is no `HashCode` constructor accepting a `params object[] values` so you could do all that in one line, but there are probably reasons I didn't think of this quickly. (S. the comments why such an overload does not exist.)
Problem
.NET Standard 2.1 / .NET Core 3 introduce `System.HashCode` to quickly combine fields and values to a hash code without having to care about the underlying implementation. However, it only provides `Combine` method overloads for up to 8 values. What do I do if I have a class with 9 values (3x3 matrix) or even 16 values (4x4 matrix)? Should I simply add together the results of two `Combine` calls, passing as many values as possible in each? ``` public override int GetHashCode() => HashCode.Combine(M11, M12, M13, M21, M22, M23, M31, M32) + HashCode.Combine(M33); ``` Looking at the source, I cannot completely argue if this may have implications I don't know of.