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

标签 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 是否提供任何帮助程序/实用程序来执行此操作,这样就不必一遍又一遍地编写相同的代码并冒着引入错误的风险?

最佳答案

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

不过与此同时,这与您所拥有的差不多,尽管有人建议应该有更多。

不过,一个紧迫的问题是,它会阻止人们思考值(value)观吗?可以看到什么范围的值,通常会看到等等。您提供的代码不一定是将两个整数组合成哈希码的最佳方法。如果两个对象很少有相同的 h1然后 return h1有待改善。如果h1始终在 0 到 15 和 h2 的范围内很少超过几百个(h1 << 4) + h2有待改善。如果h1h2将根据用户输入直接设置,然后您需要混合随机种子以防止 hash-DoSing 等。

关于c# - 我应该使用通用实用程序从多个字段生成 HashCode 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37302339/

相关文章:

c# - 比较两个字符串后需要显示更改的文本

.net - 第三方 .NET 模块未在 "lm"命令的输出中列出

c# - 这种类型的委托(delegate)叫什么(C#)

c# - 泛型 List<T>.Contains() 中的值与引用相等性

c# - 如何在 xaml 中将空字符串指定为目标空值

c# - 无法重载具有类型约束的泛型方法

c# - 通用 IEqualityComparer<T> 和 GetHashCode

c# - 当对象的标识符为空时,GetHashCode 应该返回什么?

c# - 以编程方式与 IE 浏览器交互以填写表单和导航等

.net - 编写了一个修改 TextControl 的 resharper 插件?