【问题标题】:Hash function that maps similar inputs to similar outputs?将相似输入映射到相似输出的哈希函数?
【发布时间】:2009-11-06 11:35:29
【问题描述】:

是否存在一个哈希函数,输入的微小变化会导致输出的微小变化?例如,类似:

hash("Foo") => 9e107d9d372bb6826bd81d3542a419d6
hash("Foo!") => 9e107d9d372bb6826bd81d3542a419d7 <- note small difference

【问题讨论】:

  • 那将是一个真的糟糕的哈希算法......
  • 对于加密哈希,是的,这很糟糕,但我想将它用于其他用途。
  • 我认为您需要提供有关此类功能的预期目的的更多详细信息。绝对没有具有该属性的加密哈希函数,但也许您正在寻找不同的东西?
  • 您对输出中的“小变化”的定义是什么?编辑距离(将哈希视为字符串)或数字的数学距离(将哈希视为整数?)

标签: algorithm hash hashcode simhash


【解决方案1】:

我不会称其为散列,因为散列的点正好相反。但是,由于您声明的目标是输入的微小变化产生输出的微小变化,我会考虑使用soundex 函数或Ratcliff 算法。

【讨论】:

    【解决方案2】:

    我会推荐 Mark Manasse 的 simhashalgorithm

    【讨论】:

      【解决方案3】:

      一个简单的解决方案是将所有字节模块 N 异或。对于 64 位哈希,您将 XOR (input[0] ^ input[8] ^ input[16]) + 256*(input[1] ^ input[9] ^ input[17]) 等。 因此,“Foo”散列为“Foo\0\0\0\0\0”和“Foo!”散列到“Foo!\0\0\0\0”。

      【讨论】:

        【解决方案4】:

        局部敏感哈希 (LSH) 降低了 高维数据。 LSH 对输入项进行哈希处理,以便相似项 以高概率映射到相同的“桶”:

        https://en.wikipedia.org/wiki/Locality-sensitive_hashing

        另见:https://en.wikipedia.org/wiki/Perceptual_hashing

        这是一个很好的 DNA 序列感知散列示例:

        http://arxiv.org/pdf/1412.5517.pdf

        【讨论】:

          猜你喜欢
          • 2013-03-12
          • 2012-01-07
          • 2012-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-08
          相关资源
          最近更新 更多