我没有考虑过使用“MOD PRIME”类型的哈希函数,并且对于如何使用返回的哈希值在HashMap中存储值感到有些困惑。
我想实现一个HashMap,其中键是一个64位的int(long long int)。我有一个返回long int的哈希函数。问题是,使用此返回的哈希值来确定表索引的最佳方法是什么。因为我的表显然会小于哈希值的范围。
是否有任何指导方针可以选择最佳的餐桌尺寸?或者是将哈希值映射到表大小的最佳方法?
谢谢。
答案 0 :(得分:2)
您需要在某个时刻调整表格大小。根据您使用的方法,您需要在调整大小和复制操作期间重新散列所有键,或使用某种形式的dynamic hashing,例如extendible hashing或linear hashing。
至于回答问题的第一部分,因为您使用了模数的素数,您应该能够使用模数表大小的哈希值来获取索引(对于64位int和一个大小为2 ^ 16的表,它只是64位散列的16个最低有效位。至于表格大小,您选择的大小足以容纳所有数据加上一些备用空间(实际使用的值为0.75)。如果您期望大量插入,则需要提供更多的空间,否则您将始终调整表的大小。请注意,使用上面提到的动态哈希算法,这不是必需的,因为所有调整大小操作都会随着时间的推移而摊销。
另外,请记住,两个项目可以存储在同一个存储桶中(在哈希表中的相同哈希位置),哈希函数merely tells you where to start looking。因此,在实践中,您将在哈希表的每个位置都有一个条目数组。请注意,如果您使用open addressing来处理哈希冲突,则可以避免这种情况。
当然,如果您选择不同的哈希函数,有时您可以做得更好。您的目标是为表格的每个尺寸设置perfect hash function(如果您允许在调整大小时重新进行调整),请使用dynamic perfect hashing或universal hashing之类的内容。