【发布时间】:2012-04-26 04:09:23
【问题描述】:
我编写了一个方法,该方法需要能够获取任意数量的数据字段,以某种方式将它们组合成一个可散列对象,然后在字典中散列该对象以供以后查找。
到目前为止,我想出的最佳算法是对每个字段采用 ToHashCode(),然后使用某种分隔符(例如“|”)将生成的哈希码连接成一个字符串,然后使用这个结果字符串作为字典的唯一键。
有人知道更有效的方法吗?我在想也许有一些方法可以获取每个字段的哈希码,并进行一些数学运算以将它们组合成一个唯一的可哈希数字,但这只是一个猜测。
感谢您的帮助。
编辑: 我想人们可能会对我的意思感到困惑。元组在这种情况下不起作用,因为我需要将 任意 个字段组合成一个可散列对象。字段的数量仅在运行时知道,而不是在设计时知道。
关于将所有哈希码以数学方式组合成一个新哈希码的其他解决方案也不起作用,因为我需要一个可以用作字典的键的 object。我相信使用哈希码作为字典的键是非常危险的。
编辑 2: 在考虑了更多之后,我认为我最初的解决方案不是一个好的解决方案。在存在单个字段的限制情况下,我的解决方案已退化为将哈希码的字符串版本放入字典中。
我认为也许更好的解决方案是创建一个新类型,它在其构造函数中采用可枚举,并实现 GetHashCode()。 GetHashCode() 函数然后将遍历可枚举的每个值,并在哈希码函数中执行通常类型的累加器逻辑。通过这种方式,对象可以嵌入字典、哈希集等中,并按照您的预期运行。
【问题讨论】:
-
无论您选择什么,都有发生碰撞的风险。对于您的字符串版本,它可能可以忽略不计。
-
是的,你永远无法完全避免冲突,因为哈希码只有有限数量的不同可能值。
-
我会投票使用
GetHashCode()的数学组合并将其用作键,并让它能够很好地处理碰撞。例如Dictionary<int, List<object>>,如果列表包含超过 1 个对象,则比较它们以找到正确的对象。 -
@MgSam 请接受答案或提供其他信息/说明。
标签: c# .net performance dictionary hash