UUID (RFC 4122 + 非官方/草案),ULID,Snowflake ID,Sonyflake ID,TBSL(库专用)生成器!

2.03 2024-06-29 07:07 UTC

README

build Codacy Badge Packagist Downloads License: MIT Packagist Version Packagist PHP Version Support GitHub code size in bytes

一个用PHP编写的AIO唯一ID生成器。支持(参考见底部),

  • UUID
  • ULID
  • Snowflake ID
  • Sonyflake ID
  • TBSL
  • NanoId
  • Cuid2

目录

先决条件

语言:PHP 8/+

安装

composer require infocyph/uid

使用

UUID (通用唯一标识符)

节点特定的UUID的$node参数(1,6,7,8)是可选的。如果没有提供,它将随机生成。但是,如果您想跟踪UUID的来源,应使用它(在每个服务器上预先定义节点并相应地传递)。

UUID v1:基于时间的UUID。

  • 生成v1 UUID
// Get v1 UUID
\Infocyph\UID\UUID::v1();
// alternatively can also use
\Infocyph\UID\uuid1();
  • 传递您的预生成的节点(用于节点特定的UUID)
\Infocyph\UID\UUID::v1($node); // check additional section for how to generate one

UUID v3:基于名称空间的UUID。

  • 生成v3 UUID
// Get v3 UUID
\Infocyph\UID\UUID::v3('a pre-generated UUID', 'the string you wanna get UUID for');
// alternatively can also use
\Infocyph\UID\uuid3();
  • 获取预定义名称空间的v3 UUID(RFC4122 #附录C)
/**
* You can pass X500, URL, OID, DNS (check RFC4122 #Appendix C)
*/
\Infocyph\UID\UUID::v3('url', 'abmmhasan.github.io');
  • 您也可以将UUID用作名称空间
\Infocyph\UID\UUID::v3('fa1700dd-828c-4d1b-8e6d-a6104807da90', 'abmmhasan.github.io');

UUID v4:随机UUID。

  • 生成v4 UUID
// Get v4 UUID (completely random)
\Infocyph\UID\UUID::v4();
// alternatively can also use
\Infocyph\UID\uuid4();

UUID v5:基于名称空间的UUID。

  • 生成v5 UUID
// Get v5 UUID
\Infocyph\UID\UUID::v5('a pre-generated UUID', 'the string you wanna get UUID for');
// alternatively can also use
\Infocyph\UID\uuid5();
  • 获取预定义名称空间的v5 UUID(RFC4122 #附录C)
/**
* You can pass X500, URL, OID, DNS (check RFC4122 #Appendix C)
*/
\Infocyph\UID\UUID::v5('url', 'abmmhasan.github.io');
  • 您也可以将UUID用作名称空间
\Infocyph\UID\UUID::v5('fa1700dd-828c-4d1b-8e6d-a6104807da90', 'abmmhasan.github.io');

UUID v6(基于草案/非官方):基于时间的UUID。

  • 生成v6 UUID
// Get v6 UUID (Time based)
\Infocyph\UID\UUID::v6();
// alternatively can also use
\Infocyph\UID\uuid6();
  • 使用预定义节点获取v6 UUID
\Infocyph\UID\UUID::v6($node); // check additional section for how to generate one

UUID v7(基于草案/非官方):基于时间的UUID。

  • 生成v7 UUID
// Get v7 UUID for current time
\Infocyph\UID\UUID::v7();
// alternatively can also use
\Infocyph\UID\uuid7();
  • 使用预定义节点获取v7 UUID
\Infocyph\UID\UUID::v7(null, $node); // check additional section for, how to generate one
  • 或者如果您想使用预定义时间获取v7 UUID
$timeInterface = new DateTime(); // DateTime implements DateTimeInterface
\Infocyph\UID\UUID::v7($timeInterface);
  • 您也可以将这两个参数结合起来。

UUID v8(基于草案/非官方):基于时间的UUID。可按字典顺序排序。

  • 生成v8 UUID
// Get v8 UUID
\Infocyph\UID\UUID::v8();
// alternatively can also use
\Infocyph\UID\uuid8();
  • 使用预定义节点获取v8 UUID
\Infocyph\UID\UUID::v8($node); // check additional section for, how to generate one

GUID

GUID生成器,适用于所有平台。生成

\Infocyph\UID\UUID::guid()

注意:仅传递参数false将返回括号内的字符串

附加

  • 生成用于进一步使用的节点(版本:1,6,7,8)
\Infocyph\UID\UUID::getNode();
  • 解析任何UUID字符串
\Infocyph\UID\UUID::parse($uuid); // returns ['isValid', 'version', 'time', 'node']

ULID(通用唯一按字典顺序排序标识符)

  • 生成ULID非常简单,
\Infocyph\UID\ULID::generate();
  • 或者如果您想获取特定时间的ULID
\Infocyph\UID\ULID::generate(new DateTimeImmutable('2020-01-01 00:00:00'));
  • 从任何ULID字符串中提取日期时间
\Infocyph\UID\ULID::getTime($ulid); // returns DateTimeInterface object
  • 验证任何ULID字符串
\Infocyph\UID\ULID::isValid($ulid); // true/false

Snowflake ID

  • 生成新的Snowflake ID(您还可以传递预生成的worker_id和数据center_id以进行服务器/模块检测)
// Get Snowflake ID
// optionally you can set worker_id & datacenter_id, for server/module detection
\Infocyph\UID\Snowflake::generate();
// alternatively
\Infocyph\UID\snowflake();
  • 解析Snowflake ID(获取时间戳、序列、worker_id、datacenter_id)
// Parse Snowflake ID
// returns [time => DateTimeInterface object, sequence, worker_id, datacenter_id]
\Infocyph\UID\Snowflake::parse($snowflake);
  • 指定Snowflake ID的起始时间(Snowflake ID从起始日期起是唯一的,有效期为69年)
// By default, the start time is set to `2020-01-01 00:00:00`, which is changeable
// but if changed, this should always stay same as long as your project lives
// & must call this before any Snowflake call (generate/parse)
\Infocyph\UID\Snowflake::setStartTimeStamp('2000-01-01 00:00:00');

Sonyflake ID

  • 生成新的Sonyflake ID(您还可以传递预生成的machine_id以进行服务器检测)
// Get Sonyflake ID
// optionally set machine_id, for server detection
\Infocyph\UID\Sonyflake::generate();
// alternatively
\Infocyph\UID\sonyflake();
  • 解析Sonyflake ID(获取时间戳、序列、machine_id)
// Parse Sonyflake ID
// returns [time => DateTimeInterface object, sequence, machine_id]
\Infocyph\UID\Sonyflake::parse($sonyflake);
  • 指定Sonyflake ID的起始时间(Sonyflake ID从起始日期起是唯一的,有效期为174年)
// By default, the start time is set to `2020-01-01 00:00:00`, which is changeable
// but if changed, this should always stay same as long as your project lives
// & must call this before any Sonyflake call (generate/parse)
\Infocyph\UID\Sonyflake::setStartTimeStamp('2000-01-01 00:00:00');

TBSL:基于时间的键,按字典顺序排序(库专用)

  • 获取TBSL ID(您还可以传递预生成的machine_id以进行服务器检测)
// Get TBSL ID
// optionally set machine_id, for server detection
\Infocyph\UID\TBSL::generate();
// alternatively
\Infocyph\UID\tbsl();
  • 解析TBSL ID(获取时间戳、machine_id)
// Parse TBSL
// returns [isValid, time => DateTimeInterface object, machine_id]
\Infocyph\UID\TBSL::parse($tbsl);

随机ID

使用此方法可以生成随机ID。这些ID非常适合不需要大长度/格式化ID的场景,如UUID4。这些ID是唯一的,无法追踪。

NanoID(URL友好的唯一随机ID)

  • 生成
// By default, it will generate id of length 21.
// You can pass in desired length
\Infocyph\UID\RandomId::nanoId();

Cuid2(URL友好、安全且无冲突)

  • 生成
// By default, it will generate id of length 24.
// You can pass in desired length in between 4 & 24
\Infocyph\UID\RandomId::cuid2();

基准测试

支持

遇到问题?创建一个issue!

参考