【问题标题】:Is there a hash algorithm that can efficiently calculate hashes of concatenated data?有没有一种哈希算法可以有效地计算连接数据的哈希值?
【发布时间】:2022-01-20 05:06:43
【问题描述】:

假设我们有一个哈希函数H,以及两个字节字符串ab(可能很长,例如几个 MiB 大小,所以我们希望避免再次对它们进行哈希处理)。我们已经知道H(a)H(b)的值,想计算H(a ++ b)(两个字符串拼接在一起的哈希值)。

我们希望有一个函数F,它可以根据H(a)H(b)ab 的任何其他属性计算H(a ++ b),我们可以预先计算(例如长度),以及比仅对整个字符串进行哈希处理花费更少的时间。

哈希函数H 不需要是加密的,但对于 HashMap 或类似用途来说应该足够好。

HF 这样的函数是否存在?或者如果我想知道,我应该搜索/研究什么?

【问题讨论】:

  • 通常H(a ++ b) == xor(H(a), H(b)) 就足够了。

标签: algorithm hash


【解决方案1】:

Java 的字符串哈希是s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1](模整数大小)。

这个哈希的一个属性是H(a++b) = (31^b.length())*H(a) + H(b)。 您可以通过以对数时间平方来使用幂运算来计算 31^b.length()。如果您想预先计算,您可以为每个字符串预先计算 31^length 并将其与预先计算的哈希一起存储。

【讨论】:

    【解决方案2】:

    您需要详细说明您对哈希函数的期望。否则我的答案是:使用位奇偶校验作为哈希,因为 B(a++b)=(B(a)+B(b)) mod 2

    【讨论】:

      猜你喜欢
      • 2022-07-06
      • 2016-06-23
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 2017-12-26
      • 2017-02-04
      相关资源
      最近更新 更多