从其他论坛回答我自己的问题引用
如果我有两个不同的随机字符串 (s1, s2) (s1 != s2),您想知道 md5(s1) == md5(s2) AND sha1( s1) == sha1(s2)。
那么,首先对于两个特定的随机选择的字符串,md5(s1) == md5(s2) 的概率是多少?回答它的 1/2^128,因为第一个散列是一些 128 位字符串,第二个散列等于第二个散列的机会是 2^128 中的 1 或大约 2.9 x 10^-37 %。
同样,P(sha1(s1) == sha1(s2)) = 2^-160 ~ 6.8 x 10^-47 %。
现在,假设它们是独立条件(即散列函数基本上彼此独立),两个条件都为真的概率是通过将概率相乘来找到的,因为 P(X AND Y) = P(X) P( Y) 所以 P(md5(s1)==md5(s2) AND sha1(s1) == sha1(s2)) = 2^-288 ~ 2 x 10^-85 %。
当然,我们假设散列函数在字符串上彼此独立——这是对 md5 和 sha1 作为散列函数的公平假设。但是如果我们不比较 MD5 和 SHA-1,而是比较 MD5 和一个新的散列函数,它只是 MD5 应用于自身 100 次,我们会发现只要 md5(s1) == md5(s2),我们也会有md5^100(s1) == md5^100(s2),因此两者碰撞的概率与发生一次碰撞的概率相同。
同样,如果我们有一个愚蠢的“哈希”函数,它只是 silly_hash(s) = md5(s) ++ s(其中 ++ 表示连接),那么你可以证明如果 s1 != s2 和 md5(s1) = = md5(s2) then silly_hash(s1) != silly_hash(s2) -- 这意味着你永远不会与 md5 和 silly_hash 发生双重冲突。
If you take 2 specific strings and compare, there's a 1 in 2^288 ~ 497323236409786642155382248146820840100456150797347717440463976893159497012533375533056 chance of both matching. Granted if you generate roughly about 2^144 ~ 22300745198530623141535718272648361505980416 strings together, there's a good chance that both hashes will match for one.
用 3,500,000 个字符串进行测试而不是匹配项.. 那么这对我来说已经足够了(对于我曾经拥有这么多记录的数据库,它需要大约 10 年以上的输入速度(4 年内 1.400.000 条记录)-我在路上做了一个idcheck(如果需要,他们可以在某处修改1个字符))
和22300745198530623141535718272648361505980416?我什至数不过来。
希望它可以帮助某人。答案是肯定的,我可以MD5(s1)+SHA1(s1)
用作 id。