V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mafeifan
V2EX  ›  程序员

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

  •  
  •   mafeifan · 2018-06-28 23:57:26 +08:00 · 959 次点击
    这是一个创建于 2100 天前的主题,其中的信息可能已经有所发展或是发生改变。

    场景:生成一批防伪验证码插入到数据表中 随机数规则:只能是小写字母+数字的 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 条回复    2018-07-19 17:26:16 +08:00
    GeekCat
        1
    GeekCat  
       2018-07-19 17:26:16 +08:00
    laravel....?
    修改用 pluck 代替 get,然后:
    50000 个验证码,假设其中 10000 重复。
    用 array_intersect()拿到$result 和$codeArr 的差值,去掉这些,重新生成对应数量。最后 array_merge
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5418 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:49 · PVG 16:49 · LAX 01:49 · JFK 04:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.