c# - 为任意一组键(任意数据类型)获取可散列对象的最有效方法

标签 c# .net performance dictionary hash

我写了一个方法,它需要能够获取任意数量的数据字段,以某种方式将它们组合成一个可散列的对象,然后在字典中对该对象进行散列以供以后查找。

到目前为止,我想出的最好的算法是对每个字段采用 ToHashCode(),然后使用某种分隔符(例如“|”)将生成的哈希码连接到一个字符串中,然后使用这个结果字符串作为字典的唯一键。

有谁知道更有效的方法吗?我在想也许有某种方法可以获取每个字段的哈希码,并进行一些数学运算以将它们组合成一个唯一的可哈希数字,但这只是一个猜测。

感谢您的帮助。

编辑: 我认为人们可能对我的确切意思感到困惑。元组在这种情况下不起作用,因为我需要将任意 数量的字段组合成单个可散列对象。字段数仅在运行时已知,在设计时未知。

关于将所有哈希码以数学方式组合成新哈希码的其他解决方案也行不通,因为我需要一个对象,它可以用作字典的键。我认为使用哈希码作为字典的键是非常危险的。

编辑 2: 在考虑了更多之后,我认为我原来的解决方案不是一个好的解决方案。在只有一个字段的极限情况下,我的解决方案已经退化为将哈希码的字符串版本放入字典中。

我认为也许更好的解决方案是创建一个在其构造函数中采用可枚举并实现 GetHashCode() 的新类型。然后 GetHashCode() 函数将遍历可枚举的每个值,并在哈希代码函数中执行通常类型的累加器逻辑。通过这种方式,对象可以被放入字典、哈希集等中,并按照您的预期运行。

最佳答案

最简单的方法是使用 Tuple<> 组合字段的哈希码。

var dict = new Dictionary<Tuple<int, string>, MyClass>();
dict[Tuple.Create(myObj.Num, myObj.Str)] = myObj;

您也可以自己组合哈希值,但您可能会弄错。

关于c# - 为任意一组键(任意数据类型)获取可散列对象的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10146854/

相关文章:

.net - 调用 Web 服务时,我可以在 .net 中使用 TLS 1.2 或 1.1(如果 1.2 不可用)吗?

Android线程完成回调

c# - 通过使 session 无效来强制登录用户重新登录

c# - 用于过滤的 Web API 动态参数

c# - 如何让应用程序作为服务运行?

javascript - 如何最好地预安装或预加载或缓存 JavaScript 库来优化性能?

asp.net - 请求经常超时

c# - ThreadPool.QueueUserWorkItem与新线程

c# - 使用某些字符串时关闭 TextWriter 异常

.net - 如何将Twitter时间戳转换为DateTime?