【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

bannerAds