【PHP】生成UUID
首先
以前我曾编写过一个生成UUID的程序,但最近我突然发现当我重新审视程序时,它并没有生成UUID。
我打算再次审查UUID的生成方法,并将其记录下来。
顺便提一下,我所描述的UUID都是version4的。
※虽然我打算创建类似UUID的东西,但它并不是version4的…
生成 UUID
请用中文将以下内容进行改写,只需要提供一个选项:
例子1
我参考了下面这个人的文章。他用JavaScript实现了UUID4。
$pattern = "xxxxxxxx_xxxx_4xxx_yxxx_xxxxxxxxxxxx";
$character_array = str_split($pattern);
$uuid = "";
foreach($character_array as $character) {
switch($character) {
case "x":
$uuid .= dechex(random_int(0, 15));
break;
case "y":
$uuid .= dechex(random_int(8, 11));
break;
default:
$uuid .= $character;
}
}
var_dump($uuid); // e706a4ef_2a15_4145_a6a2_8a5cfc1cfe20
第二种模式
●附言 2022年7月16日
以下是这段代码,我在评论栏中向@prc990先生请教得到的。
echo preg_replace_callback(
'/x|y/',
function($m) {
return dechex($m[0] === 'x' ? random_int(0, 15) : random_int(8, 11));
},
'xxxxxxxx_xxxx_4xxx_yxxx_xxxxxxxxxxxx'
);
// c66a8d6c_f74f_4267_91c3_0c36a5bfb017
生成类似UUID的标识
// 下記を変換してますがUUIDのバージョン4になっていない...
// xxxxxxxx_xxxx_4xxx_yxxx_xxxxxxxxxxxx → %04x%04x-%04x-%04x-%04x-%04x%04x%04x
$uuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
var_dump($uuid); // ac87b6c7-b014-1454-f6e7-4660ca57f395
顺便提一句,%0(位数)是用来指定位数的。
例如,如果是%0(位数)x,那么将十进制的「1000」转换为十六进制就是「3e8」,但是加上了0后就变成了「03e8」。
如果想要用0填充来对齐位数,也可以使用它。
赠品
在Laravel中,可以这样描述如下。
use Illuminate\Support\Str;
return (string) Str::uuid();
文献引用
rfc4122
UUID(维基百科)
Laravel:helpers#method-str-uuid
使用JavaScript实现UUID4