要在磁盘文件夹内的远程服务器上存储用户上传的文件,我将文件名更改为
$filename = '/tmp/foo.txt';
$newName = sha1_file($filename); // 40 characters
//or I can do
$newName = uniqid($filename) // 13 characters
对于不太可能失败的新名称,哪种方法更健壮? 谢谢。
答案 0 :(得分:6)
更好的解决方案是使用tmpfile()
或tempnam()
。任何一个都可以保证创建一个不会发生冲突的未使用文件,并且不会被更改权限的恶意进程“截获”。 tmpfile()
会在文件关闭时自动删除该文件,而tempnam()
会将其保留在
答案 1 :(得分:1)
也不应该给出碰撞的名字。 sha1_file是一个更加计算密集型的,但它有一个有用的属性,如果两个用户上传完全相同的文件,它将被赋予相同的名称,并且只存储一次。如果你不希望很多人上传同一个文件,或者不关心将它存储两次,那么uniqid会运行得更快。
答案 2 :(得分:1)
在任何一种情况下,您都要检查文件是否已存在。 如果你想100%安全并且文件不是太大那么只需使用
sha1_file($filename);
这将拉出整个文件的SHA-1,所以即使文件已经存在,内容也是一样的。
和平
答案 3 :(得分:1)
Sha1 - 与任何哈希函数一样具有确定性的优点。在你的情况下,这可能是不需要的。 仅使用哈希函数将导致相同文件的冲突(这可能发生在现实生活中)。
在这种情况下,拥有uniqueid会更好。 虽然13个字符的较小范围表明碰撞的概率要高得多,但事实并非如此,因为很少有2个文件在同一时刻上传。甚至比使用文件名作为前缀(并通过增加$ newname的长度)也可以在大多数情况下避免碰撞。 如果要确定,可能需要为现有文件添加一些循环检查,并重建名称,直到没有冲突(或者给出一些中断条件)。