mod 素数作为 C 中哈希表的哈希函数是否足够好

Is mod prime good enough as a hash function for a hashtable in C

我需要一个尽可能高效的哈希函数,用于使用探测(开放寻址)解决冲突的哈希 table(实际上是一个哈希集)。 table 中存储的条目都是 4 字节整数,在范围内采用随机值。

我正在考虑比 djb2 更快的东西,比如

value mod LARGE_PRIME

然后 mod 再次使用我的存储桶大小。我想这个素数必然大于我的存储桶大小,这意味着我对我的 table 必须增长的大小也有某种理智限制(它可能永远不会超过 256 个条目)。

我不需要散列函数的任何密码学方面的内容 - 只要它不是非常容易发生冲突,它应该可以正常工作。

这会成为一个好的散列函数吗?我可以在每次调整大小以改进它时为我的哈希 table 容量定义一个特定的算法吗?

正确的散列函数归结为您要散列的数据:您的值的随机性如何?如果你的值在范围内均匀分布,并且范围远大于哈希桶的数量,那么只需使用

value MOD number_of_buckets

将是一个合理的散列函数 - 添加 MOD <prime> 实际上不会给你太多,实际上可能会使散列变得更糟(因为一些桶会被使用不足或过度使用更多比他们本来会的)。

质数不是魔法 - 它们有时可用于 "smooth out" 由于共同因素而产生的相关效应,但如果你一开始就没有这些相关性,那么没有它们可能会更好 -特别是如果速度是最重要的!