【问题标题】:Is a hash result ever the same as the source value?哈希结果是否与源值相同?
【发布时间】:2009-09-04 15:18:49
【问题描述】:

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

baf34551fecb48acc3da868eb85e1b6dac9de356

如果我得到它的 SHA1 哈希,结果是:

4d2f72adbafddfe49a726990a1bcb8d34d3da162

理论上,这两个值是否会匹配?我不是在这里专门询问 SHA1 - 这只是我的例子。我只是想知道哈希算法是否以防止这种情况的方式构建。

【问题讨论】:

标签: hash cryptography hash-collision hash-code-uniqueness


【解决方案1】:

嗯,这将取决于散列算法 - 但我会惊讶地看到任何明确阻止这一点的东西。毕竟,这真的不应该。

我怀疑这当然不太可能发生(对于加密哈希)......但即使发生了,也不应该造成问题。

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

【讨论】:

  • 如果有人能找到一个例子会很有趣!
  • 在 .NET Int32.GetHashCode 中也返回 int 值。
  • 最坏的情况,哈希返回输入的机会与两个输入返回相同哈希的机会相同 - 即您赢得彩票的机会要高得多。
  • Evernoob:开始吧!让我知道您在最初的几万亿千年之后的进展情况!
【解决方案2】:

当然,整数的 Python 散列算法会返回整数的值。所以哈希(1)== 1。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      散列函数可能被定义为避免散列(x)==x 的“固定点”,但您的散列奎因略有不同,因为您采用十六进制字符串表示散列而不是原始二进制文件。我认为,设计一个可能会挫败它的哈希是不可行的,而且它在数学上不太有趣,因为它依赖于 0-F 到 ASCII 字符代码的任意映射。

      请参阅Is there an MD5 Fixed Point where md5(x) == x?,了解有关 MD5 中的定点的讨论。对于 hex hash-quines 和任何其他具有 128 位输出的散列函数,概率计算同样适用。

      【讨论】:

      • 我没有考虑过我正在对字符串表示进行散列 - 在我的问题中,我的意思是指十六进制值。我想我的问题真的可以表述为“如果我对密码进行哈希处理,结果是否有可能实际上是密码本身?”
      • 除非您的密码正好是散列函数输出的长度,否则不会。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多