通用唯一词典序可排序标识符

2020-05-13 09:00:38

PermalLink GitHub是5000多万开发人员的家园,他们一起工作,共同托管和审查代码、管理项目和构建软件。

报名。

UUID v1/v2在许多环境中是不切实际的,因为它需要访问唯一、稳定的MAC地址。

UUID v3/v5需要唯一种子并生成随机分布的ID,这可能会导致许多数据结构中的碎片。

UUID v4除了随机性之外没有提供其他信息,而随机性可能导致许多数据结构中的碎片。

必须首先对最左边的字符进行排序,最后对最右边的字符进行排序(词汇顺序)。必须使用默认的ASCII字符集。在同一毫秒内,不保证排序顺序。

克罗克福德的Base32如图所示使用。此字母表不包括字母I、L、O和U,以避免混淆和滥用。

当在同一毫秒内生成ULID时,我们可以提供一些关于排序顺序的保证。即,如果检测到相同的毫秒,则随机分量在最低有效位位置处递增1位(带进位)。例如:

import{monotonicFactory}from';ulid';const ulid=monotonicFactory()//假设这些调用发生在同一毫秒ulid()内//01BX5ZZKBKACTAV9WEVGEMMVRZ ulid()//01BX5ZZKBKACTAV9WEVGEMMVS0。

如果在极不可能的情况下,您设法在同一毫秒内生成超过280个ULID,或导致随机组件溢出,而生成的ULID较少,则生成将失败。

import{monotonicFactory}from';ulid';const ulid=monotonicFactory()//假设这些调用发生在同一毫秒ulid()内//01BX5ZZKBKACTAV9WEVGEMMVRY ulid()//01BX5ZZKBKACTAV9WEVGEMMVRZ ulid()//。。。ulid()//01BX5ZZKBKZZZZZZZZZZZZX ulid()//01BX5ZZKBKZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZLUID()//抛出新的错误()!

从技术上讲,26个字符的Base32编码字符串可以包含130位信息,而ULID只能包含128位。因此,在BASE32中编码的最大有效ULID是7ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ,它对应的纪元时间是281474976710655或2^48-1。

所有实现都应该拒绝对大于此值的ULID进行解码或编码的任何尝试,以防止溢出错误。

分量被编码为16个八位字节。每个分量都以最高有效字节优先(网络字节顺序)进行编码。

0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+|32_BIT_UINT_TIME_HIGH|+-+。-+|16_BIT_UINT_TIME_LOW|16_BIT_UINT_RANDOM|+-+-+。-+|32_BIT_UINT_RANDOM|+-+|32_BIT_UINT_RANDOM|+-+。-+-+-+