我一直琢磨不透这几天......随意拍下来我的任何假设。

我们正在使用字典与整数密钥。我认为在这种情况下,密钥的值被直接用作散列。这是否意味着(如果该键在一个小范围的分组),关键散列分布(与密钥本身,对不对?)将在一个类似的小范围内,因此,对于一个Hashtable一个糟糕的选择?

会是更好的提供的IEqualityComparer是做了与素数一些聪明和模数学的方法计算更好的分布式哈希?

有帮助吗?

解决方案

这不是使用的直接的在字典中仍然会要求其散列的关键 - 一个Int32,但哈希值的的公正价值,所以推力你的问题是相关的,是的。

我相信.NET字典的工作方式不依赖于哈希值均匀分布。这需要hash % bucketCount其中bucketCount始终是首要。 (从内存的,虽然 - 我可能是错的)

您仍然可以最终与低效组当然键,如果它们发生于由桶计数间隔开。这将永远是这样,但 - 哈希表将永远只能是的真正的O(1),如果他们有独特的哈希值的的表保持了集中的所有键水桶为每个可能的哈希:)在现实中往往不是一个问题。如果你碰巧知道它的的是一个问题,那么,自定义IEqualityComparer<T>能有所帮助。

其他提示

假设你正在使用标准库散表实现,机会是关键的的散列值,即使关键是准确原因的整数,即你所指出的。

因此,虽然您关于散列分布逻辑是正确的,你的初始假设是整数密钥将意味着散列=键可能是不

如果我错了,重:.NET则很好哦;这更是一个广义的答案。 :)

做一些聪明之前,我想测试一下速度,是看它是否适合你。如果不是,然后尝试聪明的事情。但我希望它更好地息事宁人;它更重要的是,哈希值不冲突,只要发生的事情,生活会好起来的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top