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

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

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

其中,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/ulid@2.3.0/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 名用户。

​https://www.npmtrends.com/ulid​

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

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

作者:Chameera Dulanga

参考资料

[1]UUID: https://en.wikipedia.org/wiki/Universally_unique_identifier

[2]ULID: https://www.npmjs.com/package/ulid

本文转载自微信公众号「前端全栈开发者」,可以通过以下二维码关注。转载本文请联系前端全栈开发者公众号。

责任编辑:武晓燕 来源: 前端全栈开发者
相关推荐

2024-11-01 15:51:06

2017-07-01 16:02:39

分布式ID生成器

2011-12-23 13:42:05

JavaScript

2020-10-10 09:19:58

JavaScript开发技术

2023-07-21 17:08:30

2023-03-01 00:07:32

JavaScript迭代器生成器

2015-04-22 09:36:27

JAVA代码生成器

2022-10-17 18:29:55

2011-05-19 11:30:00

密码密码生成器

2024-05-29 09:05:17

2019-12-27 10:00:34

开源技术 软件

2022-11-21 17:44:03

机器学习文本生成器自然语言

2024-03-07 20:35:20

微软人工智能

2014-07-23 10:07:34

2018-11-19 10:10:51

Python数据库随机生成器

2017-03-20 17:49:21

Java Web模板代码

2017-09-06 09:26:03

Python生成器协程

2020-11-04 14:40:26

分布式Tinyid数据库

2022-12-29 08:43:54

IDredis

2024-10-29 08:30:31

点赞
收藏

51CTO技术栈公众号