我已经思考了几天...欢迎打破我的任何假设。
我们正在使用整数键的字典。我认为在这种情况下,键的值直接用作哈希值。如果键分组在一个小范围内,这是否意味着键哈希(与键本身相同,对吗?)的分布将在类似的小范围内,因此不适合用作哈希表的选择?
提供一个IEqualityComparer是否更好,它可以使用质数和模数数学来计算更好的分布式哈希?
我已经思考了几天...欢迎打破我的任何假设。
我们正在使用整数键的字典。我认为在这种情况下,键的值直接用作哈希值。如果键分组在一个小范围内,这是否意味着键哈希(与键本身相同,对吗?)的分布将在类似的小范围内,因此不适合用作哈希表的选择?
提供一个IEqualityComparer是否更好,它可以使用质数和模数数学来计算更好的分布式哈希?
它并没有直接使用,因为字典仍会要求键提供其哈希值 - 但是Int32
的哈希值恰好是其值,所以你的问题是相关的。
我认为.NET字典的工作方式不依赖于哈希值均匀分布。它采用hash%bucketCount
,其中bucketCount
始终是质数。(尽管这是从记忆中得出的 - 我可能是错的。)
当然,你仍然可能遇到一组效率低下的键,如果它们碰巧被桶计数间隔开。不过这种情况总是存在的 - 只有当所有键都具有唯一的哈希值且该表维护了每个可能的哈希的桶集时,哈希表才会真正地对于所有键都是O(1)的。实际上往往不是个问题。如果你知道它将成为一个问题,那么是的,自定义的IEqualityComparer<T>
可以帮助解决。
假设您正在使用标准库哈希表实现,即使键是整数,也很有可能键不是哈希值,正如您指出的那样。
因此,尽管您关于哈希分布的逻辑是正确的,但您最初的假设即整数键意味着哈希=键可能不正确。
如果我对.NET错误了,那么好吧;这更多是一个概括性的答案。 :)