6

ULID 与 UUID:用于 JavaScript 的可排序随机 ID 生成器

 2 years ago
source link: https://www.fly63.com/article/detial/11177
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

UUID是软件开发中最常用的通用标识符之一。然而,在过去的几年里,新的替代品挑战了它的存在。

其中,ULID 是领先的竞争对手之一,因为它提供可排序的唯一 ID。

在本文中,我将通过示例讨论 ULID 的特性,以便您更好地了解何时使用它。

了解 ULID 及其用法

ULID[2] 代表通用唯一按字母顺序排序的标识符。它每周有超过 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。

单调的ULIDs与种子时间

ULID 允许您通过传递种子时间来获取具有相同时间戳的 ID。例如,如果要创建以 2021–10–15 作为时间戳的 ID,则需要将 UNIX 时间戳(以毫秒为单位)传递给 ulid() 函数

ulid(1634263671000) // 01FJ0V986RA01G70YQ5Z0AMQE7

除此之外,ULID 允许创建一系列值不断增加的 ID。您需要做的就是使用 monotonicFactory创建一个 ulid 对象并传递相同的时间种子。

import { monotonicFactory } from ‘ulid’
const ulid = monotonicFactory()
console.log(ulid(100000)); // 00000031N0J7R2B57M8YG73J7M
console.log(ulid(100000)); // 00000031N0J7R2B57M8YG73J7N
console.log(ulid(100000)); // 00000031N0J7R2B57M8YG73J7P
console.log(ulid(100000)); // 00000031N0J7R2B57M8YG73J7Q
console.log(ulid(100000)); // 00000031N0J7R2B57M8YG73J7R

多语言支持

ULID 支持近 50 种语言,包括 JavaScript、Java、C++、Dart、Python 和 .NET。

此外,二进制表示可用于超过 15 种语言,包括 C++、Dart、Go、JavaScript 和 Python。

JavaScript 模块支持

ULID 可以轻松地与所有类型的 JavaScript 模块一起使用,包括 ES6+、CommonJS 和 AMD。

// TypeScript , ES6+ Modules
import { ulid } from ‘ulid’;
ulid();

// CommonJS
const ULID = require('ulid');
ULID.ulid();

// AMD
define(['ULID'] , function (ULID) {
  ULID.ulid()
});

// Browser
<script src="https://unpkg.com/[email protected]/dist/index.umd.js"></script>
<script>
    ULID.ulid()
</script>

每毫秒可以生成 1.21e+24 个唯一的 ULID。

ULID 是 URL 安全的,因为它不使用任何特殊字符。

小包大小 - 2.5 kB (minified), 1.2kB (GZipped).

下载时间约为 1ms –10 ms。

比 UUID 短。

与 UUID 128 格式兼容。

根据 StackOverflow 中的许多专家意见,使用 ULID 没有明显的缺点或限制。

但是,不区分大小写和 80 位随机性是开发人员在 ULID 中注意到的主要缺点。但它的字典排序能力使其在所有其他产品中独树一帜。

此外,如果我们考虑过去一年 ULID 的使用趋势,我们可以看到它处于上升趋势。虽然下载量比 UUID 少很多,但在过去的一年里它已经获得了超过 150000 名用户。

620c536f741ec.jpg

https://www.npmtrends.com/ulid

凭借所有这些功能以及我使用 UUID 和 ULID 的经验,对于需要排序的用例来说,这是不费吹灰之力的。所以,不要犹豫,在你的下一个项目中使用 ULID。

原文:https://blog.bitsrc.io/ulid-vs-uuid-sortable-random-id-generators-for-javascript-183400ef862c
作者:Chameera Dulanga

链接: https://www.fly63.com/article/detial/11177


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK