我想为上传的文件生成一个唯一的文件名。它们的长度应为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)