mediagone / small-uid
小型唯一标识符 - 类似于ULID,但大小减半(64位)。
0.6.1
2021-07-22 06:22 UTC
Requires
- php-64bit: ^7.4|^8.0
- ext-gmp: *
- mediagone/types-common: ^0.5.1|^0.6
Requires (Dev)
- phpunit/phpunit: ^9.0
README
⚠️ 此项目处于实验阶段,API可能会更改。
UUIDs经常被用作软件开发中的数据库主键。然而,它们并不是最佳选择,主要是因为它们的随机排序和由此导致的数据库索引碎片化。
使用ULIDs通常是一个非常不错的选择,可以解决UUID的大部分缺陷。
Small UIDs也是当您不需要太多唯一性且想要更短的“用户友好”编码字符串时的理想替代品。
简介
Small UIDs是专为作为高效的数据库主键使用而设计的短唯一标识符。
- 比UUID / ULID小一半(64位)
- 字典序可排序
- 可以编码为短的用户友好且URL安全的base-62字符串(《a-zA-Z0-9》)
- 用户友好字符串生成方式确保它们始终非常不同(由于相似的时戳而没有共享的前缀)
* 在预期首次碰撞之前生成的uids的理论数量。
** uid包含时间戳,因此碰撞仅可能在同一毫秒内发生。
*** 单调排序顺序,但在同一毫秒生成时顺序是随机的。
它们在内部以64位整数的形式存储(44位时间戳后跟20位随机位)
|-----------------------| |------------|
Timestamp Randomness
44 bits 20 bits
随机数字后缀仍然在同一个毫秒内创建许多id时保证相当数量的唯一性(高达1,048,576个不同的值),并且您只有在同一毫秒内生成超过1024个随机id时才可能期望发生碰撞。
排序
由于顺序时间戳,Small UIDs自然按时间顺序排序。当在数据库中插入值时,这可以提高索引,新的id被追加到表的末尾,而无需重新排列现有数据(更多信息请参阅本文)。
然而,由于随机位后缀,同一毫秒内的排序顺序无法保证。
安装
此包需要PHP(64位)7.4+和GMP扩展。
将其作为Composer依赖项添加
$ composer require mediagone/small-uid
如果您使用Doctrine ORM,您可能还需要安装适当的自定义类型
$ composer require mediagone/small-uid-doctrine
使用示例
生成Small UIDs
$uid = SmallUid::random(); // from a given base-62 string $uid = SmallUid::fromString('1GUDp752fwX');
转换Small UIDs
(string)$uid; // string(11) "1GUDp752fwX"
许可
Small UID采用MIT许可。请参阅LICENSE文件。