mediagone/small-uid

小型唯一标识符 - 类似于ULID,但大小减半(64位)。

0.6.1 2021-07-22 06:22 UTC

This package is auto-updated.

Last update: 2024-09-22 12:55:55 UTC


README

⚠️ 此项目处于实验阶段,API可能会更改。

Latest Version on Packagist Total Downloads Software License

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文件。