【问题标题】:Division method for Hash Values哈希值的除法
【发布时间】:2011-05-27 00:14:48
【问题描述】:

假设一个由 r 个字符组成的字符串被散列到 m 个槽中,将其视为 radix-128 数,然后使用除法。数字 m 很容易 表示为 32 位计算机字,但由 r 个字符组成的字符串,被视为 radix-128 数字,占用很多单词。我们如何将除法方法应用于 在不使用多个常量的情况下计算字符串的哈希值 字符串本身之外的存储字数?

【问题讨论】:

  • 请停止在此处发布您的作业问题。如果你不自己做这项工作,你就不会学习这门学科。
  • 家庭作业? (blllllllllllllllllllah 用于 SO 最小限制)

标签: data-structures hash language-agnostic


【解决方案1】:

对于任何以 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 中严格不需要)。

【讨论】:

  • @elik1991:Python 代码应该被公平阅读。我认为解释足以将其变成代码。
【解决方案2】:

您可以使用Horner's method/rule

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

【讨论】:

    猜你喜欢
    • 2010-10-20
    • 2016-02-06
    • 2013-10-09
    • 2023-04-09
    • 2021-01-15
    • 2018-11-17
    • 2013-03-30
    • 2015-11-17
    • 2016-01-06
    相关资源
    最近更新 更多