h ( k ) = k m o d m h(k) =k \mod m h(k)=kmodm
当应用除法散列法时,要避免选择m的某些值。例如,m不应该是2的幂,因为如果 m = 2 p m=2^p m=2p,则h(k)
就是k
的p
个最低位数。除非已知各种最低p
位的排列形式为等可能的,否则在设计函数时,最好考虑关键的所有位。
这段话什么意思呢?当 m = 2 3 m=2^3 m=23结果就会这样:
57 m o d 8 ≡ 1057 m o d 8 ≡ 3057 m o d 8 ≡ 10057 m o d 8 ≡ 1 57 \bmod 8 \equiv 1057 \bmod 8 \equiv 3057 \bmod 8 \equiv 10057 \bmod 8 \equiv 1 57mod8≡1057mod8≡3057mod8≡10057mod8≡1
只要低3位是057,余数结果都一样。
为什么呢?
假设,
m
=
2
p
m=2^p
m=2p ,k的低3位是
r
0
r_0
r0
-
当k的位数小于等于p时: 余数就是k除以 r 0 r_0 r0的余数
-
当k的位数大于p时:
k = r 1 ∗ 1 0 p + m + r 0 ( m > 0 ; m 、 r 1 、 r 0 都 是 整 数 ; r 0 为 低 3 位 ) k = r 1 ∗ 2 p + m ∗ 5 p + m + r 0 k=r_1*10^{p + m} + r_0 (m\gt0; m、r_1、r_0都是整数;r_0为低3位)\\ k=r_1*2^{p + m}*5^{p + m} + r_0 k=r1∗10p+m+r0(m>0;m、r1、r0都是整数;r0为低3位)k=r1∗2p+m∗5p+m+r0
k除以 m = 2 p m=2^p m=2p的余数就是k除以 r 0 r_0 r0的余数