Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
4.7k views
in Technique[技术] by (71.8m points)

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

laravel的代码:

    use IlluminateSupportStr;
    /**
     * 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的代码的写法风格。应该对自己有些帮助


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...