Php Sha1子串问题
我正在创建一个pastebin类型的站点,并试图将id设置为一个随机字符串,如paste.com/4RT65LPhp Sha1子串问题,php,sha1,pastebin,Php,Sha1,Pastebin,我正在创建一个pastebin类型的站点,并试图将id设置为一个随机字符串,如paste.com/4RT65L 在我将id添加到数据库之前,我得到了它的sha1,但是我得到了sha1的前8个字符的子字符串。他们有可能是同一个sha1的双重副本吗?我不想让它们意外地成为第二次粘贴,并且id已经被使用了?那么,8个字符发生冲突的几率明显高于两个Sha1键发生冲突的几率,但这并不意味着它可能会发生 我建议你对它做一些测试。生成随机输入并查看发生碰撞需要多长时间。如果你喜欢结果,那就去做吧。否则,您将需
在我将id添加到数据库之前,我得到了它的sha1,但是我得到了sha1的前8个字符的子字符串。他们有可能是同一个sha1的双重副本吗?我不想让它们意外地成为第二次粘贴,并且id已经被使用了?那么,8个字符发生冲突的几率明显高于两个Sha1键发生冲突的几率,但这并不意味着它可能会发生 我建议你对它做一些测试。生成随机输入并查看发生碰撞需要多长时间。如果你喜欢结果,那就去做吧。否则,您将需要更长的字符串 编辑:您还可以通过查看地图来计算碰撞的几率 基本上,如果您从SHA-1中获取前8个十六进制数字,那么您有16**8(4294967296)个不同的可用组合 使用在线生日悖论计算器,经过大约9200次哈希运算后,发生冲突的几率为1%。在你有10%的机会之前,大约需要30000个哈希,在你有50%的机会之前需要77000个哈希 重要的是要指出,只要您的哈希函数能够很好地实现伪随机,那么使用哪一个都无关紧要(无论是SHA1、MD5还是任何形式的校验和)——这些数字假设完全是随机输入,因此您只能通过使用越来越好的哈希函数来接近这些值
所以最终,这取决于你期望的流量。如果这是一个小网站,你可能会逃脱它。如果是大量流量,则发生冲突的几率非常高。8个字符发生冲突的几率明显高于两个Sha1键发生冲突的几率,但这并不意味着发生冲突的可能性很大 我建议你对它做一些测试。生成随机输入并查看发生碰撞需要多长时间。如果你喜欢结果,那就去做吧。否则,您将需要更长的字符串 编辑:您还可以通过查看地图来计算碰撞的几率 基本上,如果您从SHA-1中获取前8个十六进制数字,那么您有16**8(4294967296)个不同的可用组合 使用在线生日悖论计算器,经过大约9200次哈希运算后,发生冲突的几率为1%。在你有10%的机会之前,大约需要30000个哈希,在你有50%的机会之前需要77000个哈希 重要的是要指出,只要您的哈希函数能够很好地实现伪随机,那么使用哪一个都无关紧要(无论是SHA1、MD5还是任何形式的校验和)——这些数字假设完全是随机输入,因此您只能通过使用越来越好的哈希函数来接近这些值
所以最终,这取决于你期望的流量。如果这是一个小网站,你可能会逃脱它。如果流量很大,则发生碰撞的几率非常高。在分配id之前,您可以随时检查它是否被占用。。。或者更好,在数据库字段中添加一个唯一的id。。。问题已解决。:) 等等,你说的是SHA1的身份证。你不是说自动公司的身份证吧?我的第一个猜测是:
356a192b
da4b9237
77de68de
如果您使用的是随机id,为什么要在其上运行sha1?在分配id之前,您可以始终检查它是否被占用。。。或者更好,在数据库字段中添加一个唯一的id。。。问题已解决。:) 等等,你说的是SHA1的身份证。你不是说自动公司的身份证吧?我的第一个猜测是:
356a192b
da4b9237
77de68de
如果您使用的是随机id,为什么要在其上运行sha1?我发现了,我的代码是:
strtoupper(substr(sha1($token_start . $id . $token_end), 0, 8))
其中,$id是为了找出数据库+1中的id总量而获得的id,它是下一个id,因为它是自动递增的
然后,当它插入条目时,它会插入加密的
$token\u start和$token\u end都是随机字符串,您可以选择使新id唯一
我做了一个循环,将它们插入到一个数据库中32000次,只有id,自动递增和新id,我用distinct进行搜索,没有得到任何副本。这对我来说已经足够了。任何评论都会有帮助。我不知道要多久才会发生碰撞。如果有人知道第一个是什么时候,那就太棒了。我想出来了,我的代码是:
strtoupper(substr(sha1($token_start . $id . $token_end), 0, 8))
其中,$id是为了找出数据库+1中的id总量而获得的id,它是下一个id,因为它是自动递增的
然后,当它插入条目时,它会插入加密的
$token\u start和$token\u end都是随机字符串,您可以选择使新id唯一
我做了一个循环,将它们插入到一个数据库中32000次,只有id,自动递增和新id,我用distinct进行搜索,没有得到任何副本。这对我来说已经足够了。任何评论都会有帮助。我不知道要多久才会发生碰撞。如果有人知道第一个字符串什么时候会出现,那就太棒了。我想过这样做,但我不知道如何编写一个匹配两个精确字符串的程序。有什么想法吗?生成完全随机的字符串并计算它们的散列。散列函数是(或者至少它们试图是)伪随机的,所以输入是否有意义应该没有区别。那么,为什么不告诉我们“显著更高”到底意味着什么?如果我有一个流量大的站点,我会怎么做?我不知道,但我想知道像tinyurl这样的大网站会做什么?罗伯特,就像我提到的,你有40亿个选择。如果你发现一个碰撞,在数字上加1,直到你找到一个唯一的