For i=1 to 1000000
mystring.s=Str(i)+"'2013-"+mm+"-"+dd+"','"+valoare+"','"+curs+"','"+total+"','"+Str(cont)+"','"+simbolcont+"','Denumire"+Str(i)+"','"+valuta.s+"','"+RSet(Str(i),40,"0")+"','"+total.s+"'"
id.s=UCase(MD5Fingerprint(@mystring.s,StringByteLength(mystring))+SHA1Fingerprint(@mystring,StringByteLength(mystring)))
Next i
上面的代码是在Purebasic中,但我对使用它的uniqueid原则更感兴趣 我可以说在1,000,000个生成的字符串中我没有发现任何碰撞
MD5(String)+ SHA1(String)为uniqueid生成了72个字符的字符串?
请记住,String在两个函数中都是相同的,并且variyng长度为300-350个字符
或简单的问题
如果SHA1碰撞,同一个字符串的MD5也会发生碰撞?或相反亦然? 我不是数学天才,但我猜这个碰撞因素很低..
我不能在这里使用基于时间戳的uniqueid。
感谢您的时间。
答案 0 :(得分:0)
从其他论坛回答我自己的问题引用
如果我有两个不同的随机字符串(s1,s2)(s1!= s2),你想知道md5(s1)== md5(s2)AND sha1(s1)== sha1(s2)的概率。
那么,首先对于两个特定的随机选择字符串,md5(s1)== md5(s2)的概率是多少?回答它的1/2 ^ 128,因为第一个哈希值是一些128位字符串,第二个哈希值等于第二个哈希值的概率是2 ^ 128或约2.9 x 10 ^ -37%。
同样,P(sha1(s1)== sha1(s2))= 2 ^ -160~6.8 x 10 ^ -47%。
现在假设它们是独立条件(即散列函数基本上彼此独立),两个条件都为真的概率,通过乘以概率得到,因为P(X和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)然后是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 char在某处))
和22300745198530623141535718272648361505980416?我甚至无法计算。
希望它可以帮助某人。答案是是我可以使用MD5(s1)+SHA1(s1)
作为ID。