【发布时间】:2011-06-22 19:22:56
【问题描述】:
我最近在一些关于 Hashtables 的采访中得到了训练,什么时候需要覆盖 GetHashCode()。讨论越来越深入,直到我认输。
我现在正在做一些研究,以涵盖为下次准备的所有内容。
我发现了这篇优秀的文章,我想分享: http://msdn.microsoft.com/en-us/library/ms379571(VS.80).aspx#datastructures20_2_topic5
1) 我觉得不太舒服的是字典是基于哈希的,但列表显然不是。这是否仅意味着在 List 和 Array[] 中搜索是线性的,而在字典或哈希表中搜索是恒定的,因此要快得多?就这些了吗?
2) 如果我使用类作为字典中的键,我需要根据任何必需的标识字段覆盖该类上的 GetHashcode() 以使实例唯一。但是,仍然可能发生两个 ID 字段相等并且会生成相同的哈希码的情况?如果是这种情况,在具有相同哈希码的两个实例发生冲突时会发生什么?
3) 碰撞如何解决?我在文章中读到了关于哈希表冲突和字典链接的重新散列方法。但我仍然不确定它是如何工作的,因为我不是数学天才。 :-\ 谁能更好地解释它是如何工作的?
非常感谢, 卡夫
【问题讨论】:
-
如果生成相同的哈希码,则在对象上运行 equals 函数以确定相等性。所以不要忘记也覆盖该函数。
-
我只想感谢所有做出贡献的人。我接受了一次采访,他们要求 HashSet 哈哈。正如我们讨论的那样,我一口气给了他所有哈希的赞成/反对意见,他印象深刻。通过了面试。所以一定是对的。 ;)
标签: .net