【问题标题】:Is this recursive random string generation computationally expensive?这种递归随机字符串生成计算成本高吗?
【发布时间】:2018-11-04 15:07:30
【问题描述】:

我创建了一个函数来在用户注册时为他们生成一个唯一的推荐代码,我想确保唯一性,所以我检查它是否已经存在,如果存在,那么我再次递归调用该函数:

        public function generateUniqueReferralCode()
        {
            $referral_code = str_random(8);

            if(User::where('referral_code', $referral_code)->exists()) {
                $referral_code = $this->generateUniqueReferralCode();
            }

            return $referral_code;
        }

我的问题是,这计算成本高吗?是否可以以更有效的方式完成,因为它必须扫描用户表?假设我们有 100 万用户,如果密钥已经存在,它将检查 100 万用户记录。

【问题讨论】:

  • 在表列中添加 UNIQUE 约束将是一个更好的选择,如果插入失败再试一次。
  • 你可以用一个更快的简单循环来替换递归,但总的来说,我会说递归的性能应该不会太差,只要 str_random(8) 真的生成随机字符串。但一如既往:对其进行基准测试:)
  • @Shubanker 你的意思是在数据库级别?我的迁移中有以下内容:$table->string('referral_code')->unique()->nullable();
  • 在这种情况下,约束不允许插入重复的推荐代码,并且会抛出一个错误,您只需要处理它们,我也不知道您为什么要这样做nullable()
  • 在 MySQL 中,可以在具有唯一约束的表中有多个空值:stackoverflow.com/questions/3712222/…

标签: php performance laravel-5 optimization


【解决方案1】:

不,数据库使用高效的索引(搜索树或哈希码)来进行高效的查找,因此记录的数量实际上并不重要。

但是你为什么不增加一个计数器来隐式保证唯一性呢? (如果你愿意,可以添加随机盐。)

【讨论】:

    【解决方案2】:

    PHP 函数非常昂贵。所以我认为下面的速度要快一些(没有基准测试):

    public function generateUniqueReferralCode() {
        $referral_code = str_random(8);
    
        while (User::where('referral_code', $referral_code)->exists()) {
            $referral_code = str_random(8);
        }
    
        return $referral_code;
    }
    

    【讨论】:

      【解决方案3】:

      我的方法会简单一些。与其检查所有这些记录的唯一性,我宁愿生成一个随机键并植入最后一条记录或要生成的记录的主键。

      例如,这是我的想法

      1. 生成随机密钥 - 1234abc
      2. 获取最后一条记录的主键。结果 - 3
      3. 将其附加到密钥 - 1234abc3(将永远是 unqiue)

      【讨论】:

        猜你喜欢
        • 2017-08-01
        • 2011-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        相关资源
        最近更新 更多