universetech-inc / xid-php
全局唯一ID生成器
Requires
- php: >=7.0.0
Requires (Dev)
- phpunit/phpunit: ~6.0
This package is not auto-updated.
Last update: 2024-09-17 19:00:39 UTC
README
此项目是Go语言库在以下位置的PHP实现:[链接](https://github.com/rs/xid)
包xid是一个全局唯一ID生成库,可以直接安全地用于服务器代码。
xid使用Mongo Object ID算法生成全局唯一ID,采用不同的序列化方式(base64),以便在作为字符串传输时更短:[链接](https://docs.mongodb.org/manual/reference/object-id/)
- 4字节值表示自Unix纪元以来的秒数,
- 3字节机器标识符,
- 2字节进程ID,以及
- 3字节计数器,从随机值开始。
ID的二进制表示与Mongo 12字节Object IDs兼容。字符串表示使用base32 hex(无填充)以提高存储在此形式时的空间效率(20字节)。使用base32的十六进制变体来保留ID的可排序属性。
xid不使用base64,因为大小写敏感性和2个非字母数字字符在作为字符串在各个系统之间传输时可能存在问题。也没有保留Base36,因为1/它不是标准 2/结果大小不可预测(不是位对齐的)3/它不会保持可排序。要验证base32 xid
,请期望一个20个字符长、全小写,由a
到v
字母和0
到9
数字组成的序列([0-9a-v]{20}
)。
UUIDs是16字节(128位)和36个字符的字符串表示。Twitter Snowflake ids是8字节(64位),但需要机器/数据中心配置和/或中央生成服务器。xid介于两者之间,具有12字节(96位)和更紧凑的URL安全字符串表示(20个字符)。不需要配置或中央生成服务器,因此可以直接用于服务器代码。
功能
- 大小:12字节(96位),小于UUID,大于snowflake
- 默认使用base32 hex编码(作为可打印字符串传输时为20个字符,仍然可排序)
- 未配置,您不需要设置唯一的机器和/或数据中心ID
- K-有序
- 嵌入1秒精度的时钟
- 每秒每主机/进程保证16,777,216(24位)唯一ID的唯一性
最好与xlog的RequestIDHandler一起使用。
参考
- http://www.slideshare.net/davegardnerisme/unique-id-generation-in-distributed-systems
- https://en.wikipedia.org/wiki/Universally_unique_identifier
- https://blog.twitter.com/2010/announcing-snowflake
- Python端口由Graham Abbott提供:[链接](https://github.com/graham/python_xid)
安装
需求
- PHP >= 7.0.0
- 启用POSIX
- APCu扩展(可选,用于在请求之间共享计数器)
composer require fpay/xid-php
使用
$guid = \Fpay\Xid\Generator::create(); echo $guid . PHP_EOL; // Output: 9m4e2mr0ui3e8a215n4g
获取xid
嵌入信息
$guid->machine(); $guid->pid(); $guid->time(); $guid->counter();
从字符串解码
$guid = \Fpay\Xid\Generator::fromString("9m4e2mr0ui3e8a215n4g");
许可
所有源代码均受MIT许可证许可。