哈希值的分区方法

时间:2010-12-17 08:31:55

标签: data-structures hash language-agnostic

假设将一串r个字符作为a处理到m个槽中 radix-128编号然后使用除法。数字m很容易 表示为32位计算机字,但r字符串,视为 radix-128号码,需要很多单词。我们如何应用划分方法 计算字符串的哈希值而不使用超过常量 字符串本身以外的存储字数?

2 个答案:

答案 0 :(得分:3)

对于基数r中的任何n位数字:

number=a0*r^0+a1*r^1+a2*r^2+...+a(n-1)*r^(n-1)

要计算该数字mod m的值,我们

(a0*r^0+a1*r^1+a2*r^2+...+a(n-1)*r^(n-1))%m

但是,请注意

(a0*r^0+a1*r^1+a2*r^2+...+a(n-1)*r^(n-1))%m
   = ((a0*r^0)%m + (a1*r^1)%m+(a2*r^2)%m+...+(a(n-1)*r^(n-1))%m)%m
   = (sum over 0<=i<n: (ai*r^i)%m)%m

因此,您可以一次迭代一个字符,计算(ai ^ ri)%m的值并累计总和。

代码(在Python中):

def hash_code(s,radix,mod):
        pwr=1 # radix^0=1
        answer=0
        for index,character in enumerate(s):
            answer=(answer+(ord(character)*pwr)%mod)%mod
            pwr=(pwr*radix)%mod # radix^(i+1)=radix*radix^i
        return answer

请记住在每次操作后使用%运算符以避免溢出(尽管Python中严格不需要这样做)。

答案 1 :(得分:3)

您可以使用Horner's method/rule

y = 0
for i = (n - 1) downto 0
    y = (ai + 128y) mod m
return y