正在生成唯一的文件名


Generating unique filename

我想为上传的文件生成一个唯一的文件名。它们的长度应为5个字符,并且仅包含以下字符:abcdefghijklmnopqrstuvwxyz0123456789。这是我的代码:

$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
$length = 5;
$filename = '';
for($i = 0; $i < $length; $i++)
{
    $filename += $chars[mt_rand(0, 36)];
}
echo $filename;

但我最终总是得到1或2个字符长的整数,而不是任何字符串。如果我运行这个代码:

$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
$length = 5;
$filename = '';
for($i = 0; $i < $length; $i++)
{
    echo $chars[mt_rand(0, 36)];
}

它运行良好,我得到以下输出:8iwzf

我在这里可能做错了什么?谢谢

5个字符不会给您带来太多的"唯一性"(熵),因此您有复制文件名的风险。

为什么不使用

$filename = uniqid();

你可以通过添加前缀和其他东西来添加熵,使(在现实世界中)重复的机会为零。

您正在添加(+=)。您希望使用句点连接字符串。

$filename .= $chars[mt_rand(0, 36)];

现成代码:

$file_ext = substr($file['name'], -4); // e.g.'.jpg', '.gif', '.png', 'jpeg' (note the missing leading point in 'jpeg')
$new_name = sha1($file['name'] . uniqid('',true)); // this will generate a 40-character-long random name
$new_name .= ((substr($file_ext, 0, 1) != '.') ? ".{$file_ext}" : $file_ext); //the original extension is appended (accounting for the point, see comment above)