我正在实现一个应该存储32位值对的哈希表 . 考虑到我的元素是固定大小,我使用一个非常简单的散列函数:
hash(a,b) = asUint64(a) + (asUint64(b) << 32)
有了它,我得到一个哈希表中的元素索引(即它对应的桶):
index(a,b) = hash(a,b) % hash_size
其中hash_size是我表上的条目/桶数 . 我已经意识到,如果我用bitwise mod of 2替换"modulus"运算符,将hash_size固定为2的幂,我可以加快这个实现. Except, when I do that, most of my pairs end up on the first bucket! 为什么会发生这种情况?
1 回答
我的猜测是你的数据在
a
中没有均匀分布 . 考虑将a
和b
连接为您的哈希码:假设您有一个包含一百万个条目的表,那么您的哈希索引就是
更糟糕的是,假设
a
的范围从1到100.然后您对a
的高阶位的依赖性更小 .如您所见,如果您的哈希表没有至少40亿个条目,则您的哈希码根本不依赖于b,并且
hash(x, a)
将与所有x
发生冲突 .