HashCode.Combine 是可交换的吗?

Gal*_* A. 0 c# hashcode

具体来说,是

HashCode.Combine<T1,T2>(T1, T2)
Run Code Online (Sandbox Code Playgroud)

可交换的? 即是真的吗

HashCode.Combine(a, b) == HashCode.Combine(b, a)
Run Code Online (Sandbox Code Playgroud)

对于任何 ab

Dmi*_*nko 5

为什么不进行一个简单的实验,例如

public static void Experiment() {
  for (int i = 0; i < 100; ++i)
    for (int j = 0; j < 100; ++j) {
      int a = HashCode.Combine(i, j);
      int b = HashCode.Combine(j, i);

      if (a != b) {
        Console.Write($"Combine({i}, {j}) = {a} != {b} = Combine({j}, {i})");

        return; 
      }
  }

  Console.Write("Seems to be commutative");  
}
Run Code Online (Sandbox Code Playgroud)

结果:

Combine(0, 1) = -839320321 != 864340100 = Combine(1, 0)
Run Code Online (Sandbox Code Playgroud)

所以Hash.Combine(当前的实现,.Net Core 3.1)不是可交换的