2010-10-08 62 views
1

我想提出一个引擎收录类型的网站,我试图让ID是一个随机字符串像paste.com/4RT65LSHA1子问题

我收到ID的SHA1之前,我把它添加到数据库中,但我得到了sha1的前8个字符的子字符串。他们是否有可能成为同一sha1的双份副本?我不希望他们意外成为第二个贴有已经使用过的ID的贴?

回答

6

那么在8个字符中碰撞的几率要比与两个Sha1键发生碰撞要高得多,但这并不意味着它很可能会发生。

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

编辑:你也可以通过查看Birthday Paradox来计算碰撞的几率。基本上,如果你从SHA-1中取出前8个十六进制数字,那么你有16 ** 8(4,294,967,296)不同的可用组合。

使用在线Birthay悖论计算器,在大约9200次散列之后,您将有1%的碰撞几率。在你有10%的机会之前它将需要约30,000次散列,而在你有50%的机会之前需要77,000次散列。

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

所以最终,这取决于您期望的流量。如果这是一个小型网站,你可能会逃避。如果这是一个很大的交通量,那么你的碰撞几率非常高。

+0

我想过这样做,但我不知道如何去编写一个匹配两个确切字符串的程序。有任何想法吗? – 2010-10-08 03:08:39

+0

生成完全随机的字符串并计算它们的哈希值。散列函数是(或者至少它们试图是)伪随机的,所以输入是否有意义也没有区别。 – riwalk 2010-10-08 03:10:08

+0

那么,为什么不告诉我们“显着更高”真的是什么? – stillstanding 2010-10-08 03:23:04

1

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

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

356a192b 
da4b9237 
77de68de 

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

+0

autoinc id在数据库上,我想实际的id人们看到是随机的,以便他们不会看到其他人的帖子。就像现在它是id = 45,他们可以将其更改为0-45并查看所有这些帖子。总体而言,这仅仅是为了知识,我不希望获得超过200个帖子,但是希望它能像tinyurl那样写作 – 2010-10-08 03:55:25

+2

如果你想让url是随机的,那么你不需要散列。要看你的id = 45,我只需输入fb644351。生成* real *随机字符串并将其存储在具有唯一索引的记录中,然后在收到URL时搜索该字符串。 – DGM 2010-10-08 19:09:57

0

我想通了,我的代码是:

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

其中$ ID是是找到了什么ID的总量是在数据库+ 1,是因为下一个ID获得的ID它是自动增量。

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

$ token_start和$ token_end都是随机字符串,您可以选择使其具有唯一性。

我做了一个循环,将它们插入数据库32000次,只是id,autoincrement以及新的id,我做了一个独特的搜索,并没有得到任何dublicates。这对我来说已经足够了。任何评论都会有帮助。我不知道它会花多长时间,它会给我一个碰撞。如果有人知道什么时候第一个会是那么棒。

+0

正如我所提到的那样,在30k的时候,碰撞几率有10%左右。你不能保证什么时候发生碰撞,因为它是基于偶然的。在77k时,你将有50-50的机会。 – riwalk 2010-10-08 13:57:45