歡迎光臨
每天分享高質量文章

ULID vs UUID:JavaScript 的可排序隨機 ID 生成器

UUID是軟體開發中最常用的通用識別符號之一。然而,在過去的幾年裡,新的替代品挑戰了它的存在。

其中,ULID 是領先的競爭對手之一,因為它提供可排序的唯一 ID。

在本文中,我將透過示例討論 ULID 的特性,以便你更好地瞭解何時使用它。

瞭解 ULID 及其用法

ULID 指的是 Universally Unique Alphabetically Sortable Identifier

它每週有超過 271K 的 NPM 下載和 1.7K 的 GitHub Stars。

用法

你可以使用命令列輕鬆安裝 ULID 的 NPM 庫,並在你的專案中使用它。

import { ulid } from ‘ulid’;
ulid();

它帶有一些驚人的功能,可以解決 UUID 的一些缺點。例如,在將 UUID 與關係資料庫一起使用時,由於缺乏內建排序,索引資料可能會很困難。在這種情況下,你可能會被迫包含另一個屬性以使資料可排序。

此外,UUID 在隨機性、效率和播種方面存在一些常見問題,ULID 都可以解決。因此,我們下面來詳細瞭解一下 ULID。

1. 同時使用時間戳和隨機性

使用 UUID 生成 ID 時,僅考慮隨機性或時間戳會生成 36 個字元長的字串。

但是,ULID 會同時考慮隨機性和時間戳來生成 ID,並將它們編碼為 26 個字串(128 位)。

// Example UUID
01FHZXHK8PTP9FVK99Z66GXQTX

ULID 的前 10 個字元表示時間戳,ULID 的第二部分表示隨機性。這兩個部分都是 base 32 編碼字串,分別使用 48 位和 80 位表示。

例如,上述 ULID 的分解如下所示:

01FHZXHK8PTP9FVK99Z66GXQTX
Timestamp (48 bits) - 01FHZXHK8P
Randomness (80 bits) - TP9FVK99Z66GXQTX

注意: ULID 使用 Crockford 的 Base32 字母表 ( 0123456789ABCDEFGHJKMNPQRSTVWXYZ) 進行編碼。它不包括 I、L、O 和 U 字母以避免任何意外的混淆。

2. UILD 是按字典順序排序的

詞典可排序性是 ULID 最突出的特性之一。

正如我們已經知道的,ULID 可以排序。ULID 的這一特性允許開發人員輕鬆管理與資料庫相關的任務,例如排序、分割槽和索引。

例如,你不需要建立額外的列來維護記錄建立時間。相反,你可以使用 ULID 的時間戳表示來根據建立時間對資料進行排序或分割槽。

注意: ULID 的時間戳部分以 UNIX 時間(以毫秒為單位)表示,直到公元 10889 年才會耗盡空間。

3. 隨機數的高安全性

大多數隨機 ID 生成器使用不安全的 Math.random() 來生成 ID。但是,ULID 預設阻止使用 Math.random(),並會根據情況自動決定合適的隨機數生成器。

例如,它將 crypto.getRandomValues 用於瀏覽器,將 crypto.randomBytes 用於 Node 環境。

但是,如果你想在 ULID 中使用 Math.random(),則需要明確允許該許可權。

import { factory, detectPrng } from 'ulid'

const random_number_gen = detectPrng(true) 
const ulid = factory(random_number_gen)

**注意:**你也可以使用自己的偽隨機數生成器來生成 ULID。

4. 單調 ULID 和種子時間

ULID 允許你透過傳遞種子時間來獲取具有相同時間戳的 ID。例如,如果要建立以 2021–10–15 作為時間戳的 ID,則需要以毫秒為單位傳遞 UNIX 時間戳才能ulid()執行。

ulid(1634263671000) // 01FJ0V986RA01G70YQ5Z0AMQE7

除此之外,ULID 允許建立一系列值不斷增加的 ID。你需要做的就是使用並傳遞相同的時間種子建立一個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

5. 多語言支援

ULID 支援近 50 種語言,包括 JavaScript、Java、C++、Dart、Python 和 .NET。

此外,二進位制表示可用於超過 15 種語言,包括 C++、Dart、Go、JavaScript 和 Python。

6. 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(壓縮後),1.2kB(開啟 GZipped 之後)。
  • 下載時間約為 1ms –10 ms。
  • 比 UUID 短。
  • 與 UUID 128 格式相容。

未來

根據 StackOverflow 中許多專家的意見,使用 ULID 沒有明顯的缺點或限制。

但是,不區分大小寫和 80 位隨機性是開發人員在 ULID 中注意到的主要缺點。但它的字典排序能力仍然使其在所有其他產品中獨樹一幟。

此外,如果我們考慮過去一年 ULID 的使用趨勢,我們可以看到它處於上升趨勢。雖然下載量比 UUID 少很多,但在過去的一年裡它已經獲得了超過 150000 名使用者。

憑藉所有這些功能以及我使用 UUID 和 ULID 的經驗,對於需要排序的用例來說,這是不費吹灰之力的。所以,不要猶豫,在你的下一個專案中使用 ULID,並在評論區中與其他人分享你的想法。

謝謝閱讀!!!

原文連結

贊(0)

評論 搶沙發

  • 暱稱 (必填)
  • 郵箱 (必填)
  • 網址

分享創造快樂