乘法哈希法对应的哈希函数 h ( k ) = ( A ∗ k m o d 2 w ) r s h ( w − r ) h(k)=(A*k\mod 2^w )rsh(w-r) h(k)=(A∗kmod2w)rsh(w−r)
w w w为计算机的每一个字的字节长度,即计算机位数,常见的有32位和64位
A A A是一个常数,满足: A A A在二进制下的长度为 w w w位
r r r是一个与哈希表大小有关的常数,设哈希表长度为 m m m, r = ⌈ log 2 m ⌉ r=\lceil\log_2 m\rceil r=⌈log2m⌉
r s h rsh rsh是右移操作,在C++编程语言中的对应代码为>>
举例说明:
假定 m = 8 m=8 m=8,则 r = 3 r=3 r=3;假定 w = 7 w=7 w=7(世界上并不存在7位的计算机),选取 A = 101100 1 ( 2 ) A=1011001_{(2)} A=1011001(2),若 k = 110101 1 ( 2 ) k=1101011_{(2)} k=1101011(2)。
哈希函数的计算如下: A ∗ k = 101100 1 ( 2 ) ∗ 110101 1 ( 2 ) = 1001010011001 1 ( 2 ) A*k=1011001_{(2)}*1101011_{(2)}=10010100110011 _{(2)} A∗k=1011001(2)∗1101011(2)=10010100110011(2),可以看到 A ∗ k A*k A∗k在二进制下长度为 2 w 2w 2w,实际上,这不是偶然,两个 w w w位二进制数相乘得到的是 2 w 2w 2w位的二进制数。
A ∗ k m o d 2 w = 1001010011001 1 ( 2 ) m o d 2 7 A*kmod2^w=10010100110011_{(2)}\mod2^7 A∗kmod2w=10010100110011(2)mod27,二进制数对 2 w 2^w 2w取余,只需要截取原二进制数的后 w w w位,这里得到 011001 1 ( 2 ) 0110011_{(2)} 0110011(2)
右移 w − r 位 w-r位 w−r位,即右移4位,得到 01 1 ( 2 ) 011_{(2)} 011(2),对应十进制数为3
乘法哈希法的优点在于其计算效率较高