带整数键的哈希表(字典等)

时间:2009-09-07 08:54:07

标签: c# hash dictionary iequalitycomparer

我已经困惑了几天......随意拍下我的任何假设。

我们正在使用带整数键的字典。我假设在这种情况下密钥的值直接用作哈希。这是否意味着(如果密钥分组在一个小范围内)密钥散列的分布(与密钥本身相同,对吗?)将在类似的小范围内,因此哈希表的选择不好?

提供一个IEqualityComparer是不是更好,它可以用素数和模数学做一些聪明的东西来计算更好的分布式哈希?

3 个答案:

答案 0 :(得分:7)

它没有直接使用 ,因为字典仍会询问密钥的哈希值 - 但Int32 的哈希值只是的值,所以问题的主旨是相关的,是的。

我相信.NET字典的工作方式并不依赖于均匀分布的哈希值。它需要hash % bucketCount bucketCount总是素数。 (那是从记忆中来的 - 我可能是错的。)

当然,如果它们碰巧被铲斗计数间隔,你仍然可能最终得到一组低效的密钥。但情况总是如此 - 如果哈希表具有唯一的哈希值并且表维护了一组,那么哈希表对于所有密钥只能真正 O(1)每个可能的哈希桶:)实际上它往往不是一个问题。如果你碰巧知道 会成为一个问题,那么是的,自定义IEqualityComparer<T>会有所帮助。

答案 1 :(得分:0)

假设您正在使用标准库哈希表实现,那么关键是哈希,即使密钥是整数,也正好是您指出的原因。

因此,虽然关于哈希分布的逻辑是正确的,但您最初假设整数键意味着哈希=键可能不是。

如果我错了:.NET那么哦;这更像是一个普遍的答案。 :)

答案 2 :(得分:0)

在做一些聪明的事情之前,我会按原样测试它的速度,看看它是否适合你。如果不是,那就试试聪明的事情吧。但我希望最好不要管它;更重要的是,哈希不会发生碰撞,只要发生这种情况,生活就会好起来。