我想为上传的文件生成唯一的文件名。它们的长度应为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
。
我在这里做错了什么?谢谢!
答案 0 :(得分:14)
5个字符不会给你很多'唯一性'(熵),因此你冒着重复文件名的风险。
为什么不使用
$filename = uniqid();
您可以通过添加前缀和其他内容来添加熵,以便重复(在现实世界中)nil。
答案 1 :(得分:9)
您正在添加(+ =)。您想使用点连接字符串。
$filename .= $chars[mt_rand(0, 36)];
答案 2 :(得分:1)
即用型代码:
$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)