【发布时间】:2017-06-02 18:47:22
【问题描述】:
我正在做一个项目,我应该在其中生成至少 70000 个包含 8 个字母数字字符的代码。代码必须是唯一的。目前我正在使用 php 通过以下函数生成这些代码:
function random_unique_serial($length, PDO $conn) {
$codeCheck=FALSE;
while (!$codeCheck) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyz';
$charactersLength = strlen($characters);
$randomCode = '';
for ($i = 0; $i < $length; $i++) {
$randomCode .= $characters[rand(0, $charactersLength - 1)];
}
$sql = "SELECT * FROM codes WHERE code=:code";
$st = $conn->prepare($sql);
$st->bindvalue(":code", $randomCode, PDO::PARAM_STR);
$st->execute();
$count = $st->rowcount();
if ($count==0) {
$codeCheck=TRUE;
} else {
$codeCheck=FALSE;
}
}
return $randomCode;
}
如您所见,此代码会检查数据库中生成的每一个代码,以确保它不是重复的。这在理论上应该有效。但是,这非常慢并且会导致请求超时。我尝试增加执行时间,但这也无济于事。
然后我决定使用数据库端方法并使用此解决方案: Generating a random & unique 8 character string using MySQL
这也很慢,一些生成的代码长度小于 8 个字符。
您能提出一个更好的解决方案吗?
【问题讨论】:
-
使用唯一索引。
-
在这种情况下,代码崩溃并且代码生成停止。
-
如果您的代码因为(有效)约束失败而崩溃,那么也许可以修复您的代码。
-
使用
INSERT IGNORE静默丢弃代码崩溃,并使用唯一索引 -
这将取决于 PDO 错误模式以及您如何处理它。如果你设置了异常,如果没有被捕获,它将停止脚本。