【发布时间】:2014-07-24 17:53:04
【问题描述】:
我需要为上传的文件生成唯一的文件名。我将名称存储在数据库中,并在生成文件名时检查以确保它是唯一的。我知道这里有很多关于这个主题的问题,但我想了解的是为什么我的脚本不起作用。
她是我获取文件名并检查它是否唯一的代码:
do {
$newName = generateRandomString(10, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
$stmt = $this->db->prepare('SELECT id FROM images WHERE file_name = :newName');
makeQuery($stmt, array(':newName' => $newName));
$row = $stmt->fetch(\PDO::FETCH_ASSOC);
} while(!empty($row));
generateRandomString() 在哪里:
function generateRandomString($length, $characters) {
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, strlen($characters) - 1)];
}
return $randomString;
}
现在,当我在数据库中使用大约 30,000 个文件名运行此程序时,返回文件名需要几秒到几分钟。
我在文件名中使用的字符数 (0-9a-zA-Z) 和长度为 10,应该有大量的潜在文件名(如果我计算正确的话,大约有 1070 亿个) .似乎根本不应该有任何冲突,至少在我得到的所有数字中(我分析的 XDebug 配置文件快照显示generateRandomString() 在返回之前运行了 100,000 次!)。
为什么这不起作用,我可以做些什么来解决它?
编辑:糟糕,我误解了 xdebug 数据。它不需要 100,000 次函数调用,而是用了 123,502 毫秒(所以是时间,而不是函数调用)。
【问题讨论】:
标签: php random filenames uniqueidentifier