V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
mafeifan
V2EX  ›  程序员

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

  •  
  •   mafeifan · Jun 28, 2018 · 1296 views
    This topic created in 2869 days ago, the information mentioned may be changed or developed.

    场景:生成一批防伪验证码插入到数据表中 随机数规则:只能是小写字母+数字的 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 replies    2018-07-19 17:26:16 +08:00
    GeekCat
        1
    GeekCat  
       Jul 19, 2018
    laravel....?
    修改用 pluck 代替 get,然后:
    50000 个验证码,假设其中 10000 重复。
    用 array_intersect()拿到$result 和$codeArr 的差值,去掉这些,重新生成对应数量。最后 array_merge
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3766 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 61ms · UTC 04:50 · PVG 12:50 · LAX 21:50 · JFK 00:50
    ♥ Do have faith in what you're doing.