场景:生成一批防伪验证码插入到数据表中 随机数规则:只能是小写字母+数字的 16 位字符串,不能连续。 已有一验证码 validationCode 表,验证码 code 字段值要求唯一。 目前代码: 用到了递归,有缺陷,目前表中已经 100w+数据,如果一次性生成 5w,哪怕有 1 条是重复的就要重新生成,虽然几率很低。
求优化~ 谢谢
private function generateUniqueValidationCodes(int $number)
{
$codeArr = [];
// 先生成指定数量的验证码
for ($i = 0; $i < $number; $i++) {
$codeArr[$i] = generate_validation_Code();
}
// 去表中查是否有存在的,如果有则重新生成,没有直接返回
$result = ValidationCodes::query()->whereIn('validation_code', $codeArr)->get();
if ($result->isNotEmpty()) {
// 递归
$this->generateUniqueValidationCodes($number);
} else {
return $codeArr;
}
}
还有一个思路,我新建一个已经保存了大批量唯一验证码的数据表,插入新验证码时直接这张表里提取,并用状态记录。
1
GeekCat 2018-07-19 17:26:16 +08:00
laravel....?
修改用 pluck 代替 get,然后: 50000 个验证码,假设其中 10000 重复。 用 array_intersect()拿到$result 和$codeArr 的差值,去掉这些,重新生成对应数量。最后 array_merge |