Sha1子串问题

时间:2010-10-08 03:01:54

标签: php sha1 pastebin

我正在制作一个pastebin类型的网站,我正在尝试将id设为随机字符串,如paste.com/4RT65L

在将数据添加到数据库之前,我得到了id的sha1但是我得到了sha1的前8个字符的子字符串。他们是否有可能成为同一个sha1的双重副本?我不希望他们偶然成为第二个已经使用了id的粘贴?

3 个答案:

答案 0 :(得分:6)

在8个字符中发生碰撞的几率明显高于与两个Sha1键碰撞的几率,但这并不意味着它可能会发生。

我建议您对它进行一些测试。生成随机输入并查看碰撞前需要多长时间。如果你喜欢这个结果,那就去吧。否则,你需要一个更长的字符串。

编辑:您还可以通过查看Birthday Paradox来计算碰撞的几率。

基本上,如果您从SHA-1获取前8个十六进制数字,那么您有16 ** 8(4,294,967,296)个不同的可用组合。

使用在线Birthay Paradox计算器,在大约9200次哈希之后,您将有1%的碰撞几率。在你有10%的几率之前需要大约30,000个哈希值,在你有50%的几率之前需要77,000个哈希值。

重要的是要指出,只要你的哈希函数做一个伪随机的好工作,你使用哪一个(无论是SHA1,MD5,还是任何形式的校验和)都无关紧要 - 这些数字假设完全随机输入,因此您只能通过使用越来越好的散列函数来接近这些值。

所以最后,这取决于你期望的流量。如果这是一个小网站,你可以侥幸逃脱。如果是大量的流量,那么你的碰撞几率非常高。

答案 1 :(得分:1)

在分配id之前,你总是可以检查它是不是......或者甚至更好,在数据库字段上放一个唯一的id ...问题解决了。 :)

等等,你说id的SHA1。你不是指autocin id吗?我的第一个猜测是:

356a192b
da4b9237
77de68de

如果您使用随机ID,为什么要在其上运行sha1?

答案 2 :(得分:0)

我明白了,我的代码是:

strtoupper(substr(sha1($token_start . $id . $token_end), 0, 8))

其中$ id是获取的id,用于查找数据库中的id总数+ 1,因为它是自动增量的下一个id。

然后当它插入条目时,它会插入加密的。

$ token_start和$ token_end都是随机字符串,您可以选择使新ID唯一。

我做了一个循环,将它们插入数据库32000次,只是id,自动增量以及新的id,我做了一个不同的搜索,并没有得到任何dublicates。这对我来说绰绰有余。任何评论都会有所帮助。我不知道它会花多长时间才能让我发生碰撞。如果有人知道第一个会是什么时候会很棒。