我正在查看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
可能更好。如果h1
和h2
将根据用户输入直接设置,则您希望混合使用随机种子以防止散列DoSing等。