这更像是一个加密理论问题,但是哈希算法的结果是否可能与源相同?例如,假设我有一个字符串:
baf34551fecb48acc3da868eb85e1b6dac9de356
如果我得到SHA1哈希,结果是:
4d2f72adbafddfe49a726990a1bcb8d34d3da162
理论上,是否存在这两个值匹配的情况?我不是在这里特别询问SHA1 - 这只是我的例子。我只是想知道是否以这样的方式构建散列算法以防止这种情况。
答案 0 :(得分:8)
嗯,这将取决于散列算法 - 但我会惊讶地看到任何明确的阻止这一点。毕竟,这真的不重要。
我怀疑它不太可能发生,当然(对于加密哈希)......但即使这样,也不应该导致问题。
对于非加密哈希(在哈希表等中使用),在某些情况下返回源值是完全合理的。例如,在Java中,Integer.hashCode()
只返回嵌入值。
答案 1 :(得分:4)
当然,整数的Python哈希算法会返回整数的值。所以hash(1)== 1。
答案 2 :(得分:4)
鉴于一个好的哈希算法,一个返回看似随机输出的算法,我相信应该平均有一个输入将自己作为输出。假设哈希可以给出N个可能的输出。这意味着有可能存在N个可能的输入。对于每一个,输出匹配输入的几率是1 / N,因此预期的固定点数是N * 1 / N或1。
答案 3 :(得分:2)
可以定义哈希函数以来避免hash(x)== x中的“固定点”,但是你的hash-quine略有不同,因为你以十六进制表示字符串表示哈希而不是原始二进制文件。我认为,设计一个可能令人沮丧的哈希是不可行的,而且它在数学上不那么有趣,因为它取决于0-F到ASCII字符代码的任意映射。
有关MD5中固定点的讨论,请参阅Is there an MD5 Fixed Point where md5(x) == x?。对于hex hash-quines和任何其他具有128位输出的散列函数,概率计算同样如此。