开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情
UUID是软件开发中最常用的通用标识符之一。然而,在过去的几年里,新的替代品挑战了它的存在。
其中,ULID 是领先的竞争对手之一,因为它提供可排序的唯一 ID。
了解 ULID 及其用法
ULID 代表通用唯一按字母顺序排序的标识符。它每周有超过 271K 的 NPM 下载和 1.7K 的 GitHub Stars。
您可以使用 npm i ulid 命令轻松安装 ULID NPM 库并在您的项目中使用它。
import { ulid } from ‘ulid’;
ulid();
它具有一些惊人的功能,解决了UUID的一些缺点。例如,当在关系数据库中使用UUID时,由于缺乏内置的排序,可能会出现数据索引的困难。在这种情况下,你可能被迫包括另一个属性来使数据可排序。
此外,UUID 在随机性、效率和生成方面存在一些常见问题,ULID 解决了这些问题。因此,让我们详细了解一下 ULID。
同时使用时间戳和随机性
当你使用UUID生成一个ID时,它将只考虑随机性或时间戳,生成一个36个字符的长字符串。
但是,ULID 会同时考虑随机性和时间戳来生成 ID,并将它们编码为 26 个字符串(128 位)。
// UUID示例
01FHZXHK8PTP9FVK99Z66GXQTX
ULID 的前 10 个字符表示时间戳,ULID 的第二部分表示随机性。这两个部分都是 base 32 编码字符串,分别使用 48 位和 80 位表示。
例如,上述 ULID 的分解如下所示:
01FHZXHK8PTP9FVK99Z66GXQTX
时间戳 (48 bits) - 01FHZXHK8P
随机数 (80 bits) - TP9FVK99Z66GXQTX
注意:ULID 使用 Crockford 的 Base32 字母表 (
0123456789ABCDEFGHJKMNPQRSTVWXYZ) 进行编码。它不包括 I、L、O 和 U 字母以避免任何意外的混淆。
UILD 是按字典顺序排序的
词典可排序性是 ULID 最突出的特性之一。
正如我们已经知道的,ULID 可以排序。 ULID 的这一特性允许开发人员轻松管理与数据库相关的任务,例如排序、分区和索引。
例如,你不需要创建一个额外的列来维护记录的创建时间。相反,你可以使用ULID的时间戳表示,根据创建时间来排序或划分数据。
注意:ULID 的时间戳部分以 UNIX 时间(以毫秒为单位)表示,直到公元 10889 年才会耗尽空间。
随机数的高安全性
大多数随机 ID 生成器使用 unsafeMath.random() 来生成 ID。但是,ULID 默认阻止使用 Math.random() 并根据情况自动决定合适的随机数生成器。
例如,它将在浏览器中使用 crypto.getRandomValues,在 Node 环境中使用 crypto.randomBytes。
但是,如果您想在 ULID 中使用 Math.random(),则需要明确允许该权限。
import { factory, detectPrng } from 'ulid'
const random_number_gen = detectPrng(true)
const ulid = factory(random_number_gen)
注意:您也可以使用自己的伪随机数生成器来生成 ULID。