11.3-3 假设一个长度为r的字符串被散列到m个槽中,方法是将其视为一个以128为基数的数,然后应用除法方法。很容易把数m表示为一个32位的机器字,但对长度为r的字符串,由于他被当作以128为基数的数来处理,就要占用若干个机器字。假设应用除法来计算一个字符串的散列值,那么如何才能除了该串本身占用的空间外,只利用常数个机器字?
(a + b) % m = (a % m + b % m) % m ................(1)(a - b) % m = (a % m - b % m) % m....................(2)(a * b) % m = (a % m * b % m) % m....................(3)而一个长度为n的字符串x可以表示为 其中为为x第i个字符, p =8 。result ← 0middle ← 0const ← 128 mod mfor i ← 1 to length[x]
do result ← (result * const) mod mmiddle ← x[i] mod m
result ← (result + middle) mod m
请能告诉我这样子做到底可以?有什么不对的地方吗?