这种递归随机字符串生成在计算上是否很昂贵?

时间:2018-05-25 09:04:24

标签: php performance laravel-5 optimization

我已经创建了一个函数,当用户注册时为其生成一个唯一的引用代码,我想确保它的唯一性,所以我检查它是否已经存在,如果确实存在,那么我会再次以递归的方式调用该函数:

        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万用户记录。

3 个答案:

答案 0 :(得分:0)

我的方法会更简单一些。我不是检查所有这些记录的唯一性,而是生成一个随机密钥并植入最后一条记录的主键或要生成的记录。

例如,这是我的思路

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

答案 1 :(得分:0)

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;
}

答案 2 :(得分:0)

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

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