一个不重复随机数算法问题,求优化

2018-06-28 23:57:26 +08:00
 mafeifan

场景:生成一批防伪验证码插入到数据表中 随机数规则:只能是小写字母+数字的 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;
        }
    }

还有一个思路,我新建一个已经保存了大批量唯一验证码的数据表,插入新验证码时直接这张表里提取,并用状态记录。

968 次点击
所在节点    程序员
1 条回复
GeekCat
2018-07-19 17:26:16 +08:00
laravel....?
修改用 pluck 代替 get,然后:
50000 个验证码,假设其中 10000 重复。
用 array_intersect()拿到$result 和$codeArr 的差值,去掉这些,重新生成对应数量。最后 array_merge

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/466709

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX