对于磁盘sha1或uniqid上的文件随机名称,哪个更好?

时间:2011-06-03 08:03:39

标签: php file upload unique sha1

要在磁盘文件夹内的远程服务器上存储用户上传的文件,我将文件名更改为

$filename = '/tmp/foo.txt';
$newName = sha1_file($filename); // 40 characters 
//or I can do
$newName = uniqid($filename) // 13 characters 

对于不太可能失败的新名称,哪种方法更健壮? 谢谢。

4 个答案:

答案 0 :(得分:6)

更好的解决方案是使用tmpfile()tempnam()。任何一个都可以保证创建一个不会发生冲突的未使用文件,并且不会被更改权限的恶意进程“截获”。 tmpfile()会在文件关闭时自动删除该文件,而tempnam()会将其保留在

http://www.php.net/manual/en/function.tmpfile.php

http://www.php.net/manual/en/function.tempnam.php

答案 1 :(得分:1)

也不应该给出碰撞的名字。 sha1_file是一个更加计算密集型的,但它有一个有用的属性,如果两个用户上传完全相同的文件,它将被赋予相同的名称,并且只存储一次。如果你不希望很多人上传同一个文件,或者不关心将它存储两次,那么uniqid会运行得更快。

答案 2 :(得分:1)

在任何一种情况下,您都要检查文件是否已存在。 如果你想100%安全并且文件不是太大那么只需使用

sha1_file($filename);

这将拉出整个文件的SHA-1,所以即使文件已经存在,内容也是一样的。

和平

答案 3 :(得分:1)

Sha1 - 与任何哈希函数一样具有确定性的优点。在你的情况下,这可能是不需要的。 仅使用哈希函数将导致相同文件的冲突(这可能发生在现实生活中)。

在这种情况下,拥有uniqueid会更好。 虽然13个字符的较小范围表明碰撞的概率要高得多,但事实并非如此,因为很少有2个文件在同一时刻上传。甚至比使用文件名作为前缀(并通过增加$ newname的长度)也可以在大多数情况下避免碰撞。 如果要确定,可能需要为现有文件添加一些循环检查,并重建名称,直到没有冲突(或者给出一些中断条件)。