infocyph / uid
UUID (RFC 4122 + 非官方/草案),ULID,Snowflake ID,Sonyflake ID,TBSL(库专用)生成器!
2.03
2024-06-29 07:07 UTC
Requires
- php: >=8.0
- ext-bcmath: *
Requires (Dev)
- captainhook/captainhook: ^5.23
- laravel/pint: ^1.16
- pestphp/pest: ^2.34
- rector/rector: ^1.1
- symfony/var-dumper: ^7.0
Replaces
README
一个用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!
参考
- UUID(RFC4122):https://tools.ietf.org/html/rfc4122
- UUID(草案/提案):https://datatracker.ietf.org/doc/draft-ietf-uuidrev-rfc4122bis
- ULID:https://github.com/ulid/spec
- Snowflake ID:https://github.com/twitter-archive/snowflake/tree/snowflake-2010
- Sonyflake ID:https://github.com/sony/sonyflake
- TBSL ID:https://github.com/infocyph/UID/blob/main/TBSL.md
- NanoID:https://github.com/ai/nanoid
- Cuid2:https://github.com/paralleldrive/cuid2