Php 这种递归随机字符串生成的计算代价高吗?

Php 这种递归随机字符串生成的计算代价高吗?,php,performance,laravel-5,optimization,Php,Performance,Laravel 5,Optimization,我创建了一个函数,用于在用户注册时为其生成唯一的引用代码,我希望确保唯一性,因此我检查它是否已经存在,如果已经存在,则我再次递归调用该函数: public function generateUniqueReferralCode() { $referral_code = str_random(8); if(User::where('referral_code', $referral_code)->exists(

我创建了一个函数,用于在用户注册时为其生成唯一的引用代码,我希望确保唯一性,因此我检查它是否已经存在,如果已经存在,则我再次递归调用该函数:

        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万用户记录检查密钥是否已经存在。

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

例如,以下是我的想法

  • 生成一个随机键-
    1234abc
  • 获取最后一条记录的主键。结果-
    3
  • 将其附加到键-
    1234abc3
    (将始终为unqiue)

  • PHP函数非常昂贵。因此,我认为下面的速度要快一点(没有进行基准测试):


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


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

    在表列中添加唯一约束是一个更好的选择,如果插入失败,请重试。您可以用一个简单的循环来替换递归,这个循环会快一点,但一般来说,只要str_random(8),递归的性能应该不会太差真正生成随机字符串。但一如往常:基准测试:)@Shubanker你是说在数据库级别?我的迁移中有以下内容:
    $table->string('reference_code')->unique()->nullable()
    在这种情况下,约束将不允许插入重复的引用代码,并将抛出一个错误。您所需要的只是处理它们,而且我不确定为什么要在MySQL中使其
    null()
    具有唯一约束的表中有多个null值是可以的:
    public function generateUniqueReferralCode() {
        $referral_code = str_random(8);
    
        while (User::where('referral_code', $referral_code)->exists()) {
            $referral_code = str_random(8);
        }
    
        return $referral_code;
    }