fpay / xid-php
全局唯一ID生成器
该软件包的官方存储库似乎已消失,因此软件包已被冻结。
Requires
- php: >=7.0.0
Requires (Dev)
- phpunit/phpunit: ~6.0
This package is not auto-updated.
Last update: 2022-07-09 16:57:07 UTC
README
本项目是PHP实现的Go语言库,可以在以下位置找到: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}
)。
UUID是16字节(128位)和36个字符的字符串表示。Twitter Snowflake ID是8字节(64位),但需要机器/数据中心配置和/或中央生成服务器。xid介于两者之间,具有12字节(96位)和更紧凑的URL安全字符串表示(20个字符)。不需要配置或中央生成服务器,因此可以直接在服务器代码中使用。
名称 | 二进制大小 | 字符串大小 | 功能 |
---|---|---|---|
UUID | 16字节 | 36个字符 | 无需配置,不可排序 |
shortuuid | 16字节 | 22个字符 | 无需配置,不可排序 |
Snowflake | 8字节 | 最多20个字符 | 需要机器/数据中心配置,需要中央服务器,可排序 |
MongoID | 12字节 | 24个字符 | 无需配置,可排序 |
xid | 12字节 | 20个字符 | 无需配置,可排序 |
功能
- 大小:12字节(96位),小于UUID,大于snowflake
- 默认使用base32 hex编码(作为可打印字符串传输时为20个字符,仍可排序)
- 无需配置,您不需要设置唯一的机器和/或数据中心ID
- K-有序
- 带有1秒精度的嵌入式时间
- 每秒每主机/进程保证1,677,721,648(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 许可证许可。