生成唯一的文件名

时间:2012-03-10 18:08:44

标签: php random filenames

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

我在这里做错了什么?谢谢!

3 个答案:

答案 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)