laravel 门面str的random函数代码的疑惑

laravel的代码:

    use Illuminate\Support\Str;
    /**
     * Generate a more truly "random" alpha-numeric string. 
     * @param int $length
     * @return string
     */
    public static function random($length = 16)
    {
         $string = '';
         
         while (($len = strlen($string)) < $length) {
             $size = $length - $len;

             $bytes = random_bytes($size);

             $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size);
         }
         return $string;
    }

这代码为什么要多创建两个变量 $len$size ,假如像我下面这么写不应该更好一点吗
自己的代码:

function random($length = 16)
{
     $string = '';
     if($length > 0){
         $bytes = random_bytes($length);
         $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $length);
     }
     return $string;
}

像我这样写不是少创建两个变量 $len$size 和少使用了strlen()方法。
laravel这样写更好吗?因为刚好用到了random方法,看了一下源代码。
laravel现在使用的人挺多的,像参考学习下laravel的代码的写法风格。应该对自己有些帮助

阅读 1.9k
2 个回答

你自己的方法,会存在一个极小概率事件,就是random_bytes()返回的内容刚好在base64_encode()编码之后,产生了至少编码后长度的25%以上的内容刚好是/+,然后结束后不是4的倍数,最多在加3个=补齐,然后 str_replace替换这三个字符为空之后,发现还小于$length.

虽然在随机里是个小概率事件,但是不代表不会发生.

你把循环去掉了,如果字符串位数不够怎么补齐呢?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题