【问题标题】:Generating unique filename生成唯一的文件名
【发布时间】:2012-03-10 18:08:43
【问题描述】:

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

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

【问题讨论】:

  • 不是+=,而是.= in filename .= $chars

标签: php random filenames


【解决方案1】:

5 个字符不会给您太多“唯一性”(熵),因此您冒着重复文件名的风险。

为什么不使用

$filename = uniqid();

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 天哪。我在 Javascript 上花了太多时间。谢谢你:)
    • 我得等一会儿。现在完成:)
    【解决方案3】:

    即用型代码:

    $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)
    

    【讨论】:

    • 请务必记住,我们希望得到专门解决所提问题的答案。如果问题中有代码,您的答案应该解决该代码本身。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2017-03-24
    • 1970-01-01
    • 2021-04-28
    相关资源
    最近更新 更多