我应该使用通用实用程序从多个字段生成HashCode吗?

时间:2016-05-18 14:17:43

标签: c# .net gethashcode

我正在查看Tuple<T1,T2>的源代码,其GetHashCode()方法使用this internal helper

Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) {
  return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2));
}

internal static int CombineHashCodes(int h1, int h2) {
  return (((h1 << 5) + h1) ^ h2);
}

由于对象的比较以及GetHasCode()的使用是如此常见的任务,我很想知道CLR或.NET是否提供了任何帮助/实用程序来执行此操作,因此我不会这样做必须一遍又一遍地编写相同的代码,并冒着引入错误的风险吗?

1 个答案:

答案 0 :(得分:4)

嗯,你当然可以使用Tuple.Create(h1, h2).GetHashCode()。使用ValueTuple非常可能出现在下一个版本中(对于C#7可能支持的那种元组),您甚至不需要分配。

与此同时,尽管有人建议应该有更多,但这与你的情况差不多。

但是,一个迫切的问题是,它会阻止人们思考这些价值观吗?可以看到哪些值的范围,常见,等等。您提供的代码不一定是将两个整数组合成哈希码的最佳方法。如果两个对象很少具有相同的h1,那么return h1可能会更好。如果h1始终在0到15的范围内,而h2几乎不超过几百,那么(h1 << 4) + h2可能会更好。如果h1h2将根据用户输入直接设置,那么您需要混合使用随机种子以防止哈希 - DoSing等。