Hash 散列结果是否与源值相同?

Hash 散列结果是否与源值相同?,hash,cryptography,hash-collision,hash-code-uniqueness,Hash,Cryptography,Hash Collision,Hash Code Uniqueness,这更像是一个密码学理论问题,但散列算法的结果是否可能与源值相同?例如,假设我有一个字符串: baf34551fecb48acc3da868eb85e1b6dac9de356 如果我得到SHA1散列,结果是: 4d2f72adbafddfe49a726990a1bcb8d34d3da162 理论上,这两个值是否会匹配?我在这里并不是特别问SHA1——这只是我的例子。我只是想知道散列算法是否是以这样一种方式构建的,以防止出现这种情况。好吧,这将取决于散列算法——但我会惊讶地看到任何明确阻止这种情

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

baf34551fecb48acc3da868eb85e1b6dac9de356
如果我得到SHA1散列,结果是:

4d2f72adbafddfe49a726990a1bcb8d34d3da162

理论上,这两个值是否会匹配?我在这里并不是特别问SHA1——这只是我的例子。我只是想知道散列算法是否是以这样一种方式构建的,以防止出现这种情况。

好吧,这将取决于散列算法——但我会惊讶地看到任何明确阻止这种情况的东西。毕竟,这真的不重要

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


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

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

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

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


有关MD5中固定点的讨论,请参阅。对于十六进制散列QUINE和任何其他具有128位输出的散列函数,概率计算同样正确。

如果有人能找到一个例子,那就太有趣了!在.NET Int32.GetHashCode中也会返回int值。最坏的情况是,一个散列返回输入的几率与两个输入返回相同的散列的几率相同,也就是说,您中彩票的几率要高得多。Evernoob:开始吧!让我知道你在经历了最初的数万亿年后的情况!我没有考虑过我正在散列一个字符串表示——在我的问题中,我是指十六进制值。我想我的问题可以用“如果我对密码进行哈希运算,结果是否可能是密码本身?”来表达,除非你的密码正好是哈希函数输出的长度,否:)相关:相关: