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



我正在查看Tuple<T1,T2>的源代码,它的GetHashCode()方法使用这个内部助手:

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是否提供了任何帮助程序/实用程序来实现这一点,这样就不必一遍又一遍地编写相同的代码并冒着出错的风险了?

当然,您可以使用Tuple.Create(h1, h2).GetHashCode()。有了ValueTuple,它很可能会出现在下一个版本中(对于C#7可能支持的元组类型),您甚至不需要分配。

不过,与此同时,这大约是你所拥有的,尽管有人建议应该有更多。

然而,一个紧迫的问题是,它是否会阻碍人们思考价值观;可以看到、将常见的值范围等。您提供的代码不一定是将两个整数组合成哈希代码的最佳方式。如果两个对象很少具有相同的h1,那么return h1可能会更好。如果h1总是在0到15的范围内,并且h2很少超过几百,则(h1 << 4) + h2可能更好。如果h1h2将根据用户输入直接设置,则您希望混合使用随机种子以防止散列DoSing等。

最新更新