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


Which is a better option for random name of file on disk sha1 or uniqid?

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

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

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

更好的解决方案是使用tmpfile()tempnam()。任何一个都可以保证创建一个未使用的文件,该文件不会发生冲突,也不会被更改您权限的流氓进程"拦截"。当文件关闭时,tmpfile()会自动删除该文件,而tempnam()会将其保留在附近

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

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

两者都不应该给出冲突的名称。sha1_file的计算量要大得多,但它有一个有用的特性,即如果两个用户上传完全相同的文件,它将被赋予相同的名称,并且只存储一次。如果你不希望很多人上传同一个文件,或者不在乎存储两次,uniqid会运行得更快。

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

sha1_file($filename);

这将拉取整个文件的SHA-1,因此即使文件已经存在,内容也是相同的。

和平

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

在这种情况下,拥有uniqueid更好。尽管13个字符的较小范围表示碰撞的概率要高得多,但事实并非如此,因为在同一时刻上传两个文件的情况很少见。即便如此,在大多数情况下,使用文件名作为前缀(并通过增加$newname的长度)也可以避免冲突。如果您想确保,您可能需要添加一些对现有文件的循环检查,并重新生成名称,直到没有冲突(或给定了一些中断条件)。