我一直在琢磨不透这几天......随意拍下来我的任何假设。
我们使用的是与整数键的字典。 我认为在这种情况下,密钥的值被直接用作散列。 这是否意味着(如果该键在一个小范围的分组),关键散列分布(与密钥本身,对不对?)将在一个类似的小范围内,因此,对于一个Hashtable一个不错的选择?
它会更好,提供的是的IEqualityComparer做了与素数一些聪明和模数学的方法计算更好的分布式哈希?
我一直在琢磨不透这几天......随意拍下来我的任何假设。
我们使用的是与整数键的字典。 我认为在这种情况下,密钥的值被直接用作散列。 这是否意味着(如果该键在一个小范围的分组),关键散列分布(与密钥本身,对不对?)将在一个类似的小范围内,因此,对于一个Hashtable一个不错的选择?
它会更好,提供的是的IEqualityComparer做了与素数一些聪明和模数学的方法计算更好的分布式哈希?
它不是直接使用的字典还是会要求其散列的关键-但一个的散列值Int32
只是价值,所以你的问题的重点是相关的,是的。
我相信,.NET词典作品不依赖于哈希值的方式均匀分布。 它采用hash % bucketCount
其中bucketCount
始终是首要。 (这从内存是虽然 - 我可能是错的。)
你仍然可以结束了一个低效率的一套课程的钥匙,如果他们碰巧由斗式计数间隔。 这将永远是这样,但-哈希表将永远只能是,如果他们有独特的哈希值和表维护一组桶的每一个可能的散列:)在现实中往往不所有键真正的 O(1)一个问题。 如果你碰巧知道,这将是一个问题,那么,自定义IEqualityComparer<T>
可能会有帮助。
您使用的是标准库散表实现假设,机会是关键不是乱码,即使这个键是整数,正是你所指出的原因。
因此,当您对散列分布逻辑是正确的,你最初的假设是整数键将意味着散列=键可能不是。
如果我错了,重:.NET则很好哦; 这更是一个广义的答案。 :)
做一些聪明之前,我想测试一下速度,是看它是否适合你。 如果不是,然后尝试聪明的事情。 但我希望它更好地息事宁人; 它更重要的是,散列不发生碰撞,只要发生的事情,生活会好起来的。