使用除法进行哈希 - 选择插槽数



所以,在CLRS中,有这样一句话

不太接近 2 的精确幂的素数通常是 m 的不错选择。

几个问题...

  1. 我知道 2 的幂只是你钥匙的低阶位......但是,假设你有来自 1 到 100 万个宇宙的密钥,每个密钥都有相等的概率是来自宇宙的任何数字(我猜如果没有其他数据,这是对你的宇宙的常见假设?(那么假设 4 个低阶位会导致 (2^4( 低阶位模式,对于 1 到 100 万的密钥来说,这种模式的可能性几乎相同?我怎么想错了?
  2. 为什么是质数?那么,如果 2 的幂不是一个好主意,为什么质数是更好的选择,而不是接近 2 次幂的合数(还有为什么它应该接近 2 的幂...哈哈(?

您正在尝试找到一个适用于典型输入数据的哈希表,而典型的输入数据可以执行您期望从好的随机数生成器中得到的事情。很多时候,你会得到格式化或半格式化的字符串,当转换为数字时,最终会变成K,K+A,K+2A,K+3A,....对于某些整数 K 和 A。如果 K+xA 和 K+yA 哈希为相同的数字 mod m,则 (x-y(A 必须是 0 mod m。如果 m 是素数,则只有在 A = 0 mod m 或 x = y mod m 时才会发生这种情况,因此在 m 中一次。但是如果 m=pq 和 A 碰巧能被 p 整除,那么每次 x-y 能被 q 整除时,你都会得到一个碰撞,这更常见,因为 q <m。>

我想接近 2 的幂,因为内存管理系统拥有结果大小的内存块可能很方便 - 我真的不知道。如果你真的关心,如果你有时间,你可以用一些有代表性的数据尝试不同的素数,看看其中哪些在实践中是最好的。

最新更新