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

32次阅读

共计 2707 个字符,预计需要花费 7 分钟才能阅读完成。

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

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

在本文中,我将通过示例探讨 ULID 的个性,以便您更好地理解何时应用它。


理解 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。

枯燥的 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. 每毫秒能够生成 1.21e+24 个惟一的 ULID。
  2. ULID 是 URL 平安的,因为它不应用任何特殊字符。
  3. 小包大小 – 2.5 kB (minified), 1.2kB (GZipped).
  4. 下载工夫约为 1ms –10 ms。
  5. 比 UUID 短。
  6. 与 UUID 128 格局兼容。

将来重点

依据 StackOverflow 中的许多专家意见,应用 ULID 没有显著的毛病或限度。

然而,不辨别大小写和 80 位随机性是开发人员在 ULID 中留神到的次要毛病。但它的字典排序能力使其在所有其余产品中自成一家。

此外,如果咱们思考过来一年 ULID 的应用趋势,咱们能够看到它处于回升趋势。尽管下载量比 UUID 少很多,但在过来的一年里它曾经取得了超过 150000 名用户。

https://www.npmtrends.com/ulid

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

正文完
 0