laravel的Str::random
背景:
laravel的Str::random或许大家都不陌生,Str::random定义在src/Illuminate/Support/Str.php,但是你知道它都有哪些应用场景吗?
先来看看,Str::random的代码逻辑,不要被最外层的while骗了,实际上这个while只会执行一次
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; }
下面这一段是Str::random的核心,表面看似简单,实则需要细细探究:
很明显,下面这段代码的执行逻辑是,先执行base64_encode($bytes),再执行str_replace,最后执行substr
$string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size);
laravel的Str::random,默认长度16,先通过random_bytes返回指定剩余长度的二进制,经过base64_encode编码$bytes,用空白替换掉编码后的/、+、=字符,最后,使用substr从0开始截取当前剩余长度的字符串进行拼接,这就是Str::random的工作原理。