【问题标题】:A hashing function which recursively builds?递归构建的散列函数?
【发布时间】:2010-01-03 23:44:16
【问题描述】:

字符串 s 是否有一个(众所周知的)散列函数,它可以从 s 的子集的散列中计算出来。 例如

hash(0 to x) 是 hash(0 to x/2) + hash(x/2 to x) // 加或任何其他数学运算

【问题讨论】:

  • 哈希应该是可交换的,所以哈希(0到x)也是哈希(x/2到x)+哈希(0到x/2)?
  • 它可能是也可能不是。对我来说没关系。

标签: hashtable hash


【解决方案1】:

您可以使用您喜欢的任何散列函数构造hash tree。因此,如果您的应用程序只需要一个可以根据部分数据计算的自定义哈希函数,您可以使用任何众所周知的哈希函数来构建它。

一个相当常用的哈希树变体是Tiger Tree Hashes,它使用Tiger算法。

【讨论】:

  • +1 这既是“安全的”又是递归的......总结函数中的“+”应该是一个单向数学函数。
  • 我已经在 Tiger 上工作了一段时间,做这样的哈希有点难,有什么建议,想法吗?
【解决方案2】:

我认为没有这样的“哈希”函数。当然会存在数学函数……但散列函数的目的是使散列尽可能少地依赖于条目,以便散列尽可能随机。

如果你仔细想想,你的哈希函数从一开始就是有缺陷的......毕竟我可以计算:

哈希(“密码”)=哈希(“密码”)+哈希(“单词”)

然后

哈希("word") = 哈希("wo") + 哈希("rd")

等等......所以最终递归构建将等于递归构建......这对于散列函数来说是

【讨论】:

  • 这假设他想要一个依赖于安全性的加密哈希。不一定依赖于安全性的哈希有很多用途,例如用于快速随机数据库检索(例如,使用哈希作为启发式查找相似记录的快速方法)。查看哈希函数的应用en.wikipedia.org/wiki/Hash_function#Applications
【解决方案3】:

有许多哈希函数可以解决您的问题。在我看来,最好的,最适合大多数应用程序的东西类似于这里定义的东西:

http://en.wikipedia.org/wiki/Rolling_hash#Rabin-Karp_rolling_hash

为实现选择一些好的和大的常量是很重要的。您需要做一些数学运算(模算术)来实现 O(1) 中的连接(从 H(A) 和 H(B) 获得 H(AB))。你也可以做相反的事情(例如,从 H(AB) 和 H(B) 计算 H(A))

【讨论】:

    【解决方案4】:

    一个普通的校验和(取模某个值)符合这个描述,但在许多情况下,就哈希函数的各种特性而言,它会被认为是一个相当差的哈希。例如,这样的哈希很容易被“破坏”(如果在某些加密方案中使用),并且它也会为类似的输入产生相同的值,其中输入中几个字符的顺序会发生变化。

    【讨论】:

      猜你喜欢
      • 2013-01-12
      • 2011-06-01
      • 2013-08-12
      • 2018-08-28
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      相关资源
      最近更新 更多