代码之家  ›  专栏  ›  技术社区  ›  SqlRyan

哈希结果是否与源值相同?

  •  4
  • SqlRyan  · 技术社区  · 15 年前

    这更像是一个密码学理论问题,但是哈希算法的结果是否可能与源值相同?例如,假设我有一个字符串:

    baf34551fecb48acc3da868eb85e1b6dac9de356
    

    如果我得到它的sha1散列,结果是:

    4d2f72adbafddfe49a726990a1bcb8d34d3da162
    

    理论上,这两个值是否匹配?我不是特意在这里问Sha1——这只是我的例子。我只是想知道哈希算法的构建方式是否能够防止这种情况的发生。

    4 回复  |  直到 15 年前
        1
  •  8
  •   Jon Skeet    15 年前

    好吧,这将取决于哈希算法——但是我会惊讶地看到有任何东西明确地阻止了这一点。毕竟,这真的不重要。

    我怀疑这是不太可能发生的,当然(对于加密散列)但即使这样,也不会造成问题。

    对于非加密散列(用于散列表等),在某些情况下返回源值是完全合理的。例如,在Java中, Integer.hashCode() 只返回嵌入的值。

        2
  •  4
  •   Alex Gaynor    15 年前

    当然,整数的python散列算法返回整数的值。所以hash(1)==1。

        3
  •  4
  •   Adam Crume    15 年前

    给出了一个好的哈希算法,它返回一个看似随机的输出,我相信平均应该有一个输入作为输出。假设散列可以给出n个可能的输出。这意味着有n个可能的输入是可能的。对于其中的每一个,与输入匹配的输出的概率是1/n,因此,固定点的预期数量是n*1/n,或1。

        4
  •  2
  •   Community CDub    8 年前

    散列函数 可以 定义为避免哈希(x)==x的定点,但您的哈希奎因有点不同,因为您采用的是哈希十六进制的字符串表示,而不是原始二进制。我认为,设计一个可能会阻碍这一点的散列是不可行的,而且从数学上来说,它就不那么有趣了,因为它依赖于0-F到ASCII字符代码的任意映射。

    Is there an MD5 Fixed Point where md5(x) == x? 讨论MD5中的固定点。对于十六进制哈希奎因和任何其他输出为128位的哈希函数,概率计算同样正确。