我正在查看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是否提供了任何帮助/实用程序来执行此操作,因此我不会这样做必须一遍又一遍地编写相同的代码,并冒着引入错误的风险吗?
答案 0 :(得分:4)
嗯,你当然可以使用Tuple.Create(h1, h2).GetHashCode()
。使用ValueTuple
非常可能出现在下一个版本中(对于C#7可能支持的那种元组),您甚至不需要分配。
与此同时,尽管有人建议应该有更多,但这与你的情况差不多。
但是,一个迫切的问题是,它会阻止人们思考这些价值观吗?可以看到哪些值的范围,常见,等等。您提供的代码不一定是将两个整数组合成哈希码的最佳方法。如果两个对象很少具有相同的h1
,那么return h1
可能会更好。如果h1
始终在0到15的范围内,而h2
几乎不超过几百,那么(h1 << 4) + h2
可能会更好。如果h1
和h2
将根据用户输入直接设置,那么您需要混合使用随机种子以防止哈希 - DoSing等。