【发布时间】:2015-02-10 14:45:52
【问题描述】:
我一直在研究哈希表,其中一些数据经过哈希处理并用于存储桶索引。
一些库使用散列与桶大小的模数,而其他库使用位掩码。 仅使用桶掩码使用的位(确保不超出范围)。
位掩码:
index = h->hash_func(key) & h->hash_mask;
模数:
index = h->hash_func(key) % h->bucket_tot;
虽然两者之间存在明显差异,例如位掩码的存储桶大小限制,但确保散列在较低位上提供良好分布、模数速度……等。
是否有充分的理由选择一个而不是另一个?
(我可能会为自己的用例尝试和基准测试,但很好奇关于此事的已知信息)。
请注意,这仅用于 key:value 存储、(字典/哈希/关联数组)和不安全相关。
使用位掩码实现动态调整大小、链接哈希表的示例:
- https://github.com/amadvance/tommyds/blob/master/tommyds/tommyhashdyn.c
- https://github.com/GNOME/glib/blob/master/glib/ghash.c
使用模数的示例:
【问题讨论】:
-
与其提出笼统和模糊的问题并抱怨答案,也许更有建设性的方法是用您希望看到的答复来回答您自己的问题。
标签: hashtable associative-array