LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

用ULID替代 UUID 的最佳实践

admin
2025年4月16日 13:4 本文热度 48

在 C# 开发中,UUID(通用唯一标识符)是一种常见的标识符,用于生成全局唯一的 ID。然而,随着分布式系统和高性能应用的需求增加,UUID 的一些缺点逐渐显现。为了解决这些问题,ULID(Universally Unique Lexicographically Sortable Identifier)作为一种替代方案,正在被越来越多的开发者采用。

点击下图查看:C# 中 GUID 的全面解析:生成、格式化与应用场景,Net9版本下的 GUID V7版本使用


1. 什么是 UUID?

UUID(Universally Unique Identifier)是一种 128 位的标识符,通常用于标识数据库记录、分布式系统中的对象等。UUID 的主要特点是:

  • • 全局唯一性:理论上,UUID 的重复概率极低。
  • • 固定长度:UUID 的长度为 128 位(16 字节)。
  • • 多种格式:UUID 通常以 36 个字符的字符串形式表示,例如:550e8400-e29b-41d4-a716-446655440000

尽管 UUID 在许多场景中表现良好,但它也存在一些局限性。


2. UUID 的局限性

  1. 1. 排序问题
    UUID 是随机生成的,无法按时间顺序排序。这在需要按时间顺序存储或查询数据的场景中会导致性能问题。
  2. 2. 可读性差
    UUID 的格式较长且随机,难以阅读和手动处理。例如:
    550e8400-e29b-41d4-a716-446655440000
  3. 3. 存储效率低
    UUID 通常以字符串形式存储,占用较多的存储空间(36 个字符)。
  4. 4. 索引性能问题
    在数据库中,UUID 的随机性会导致索引分布不均匀,从而降低查询性能。

3. 什么是 ULID?

ULID(Universally Unique Lexicographically Sortable Identifier)是一种 128 位的唯一标识符,与 UUID 类似,但它解决了 UUID 的一些局限性。ULID 的主要特点包括:

  1. 1. 按时间排序
    ULID 的前 48 位基于时间戳(毫秒级),后 80 位为随机数。这使得 ULID 可以按时间顺序排序,非常适合需要时间排序的场景。
  2. 2. 可读性更高
    ULID 使用 Base32 编码,生成的字符串更短且更易读。例如:
    01H3Z5VJ8XK4Y5F3G7T9Q2W1A6
  3. 3. 存储效率更高
    ULID 的字符串长度为 26 个字符,比 UUID 的 36 个字符更短,占用更少的存储空间。
  4. 4. 跨语言支持
    ULID 是一种标准格式,支持多种编程语言,包括 C#。

4. 为什么选择 ULID 替代 UUID?

  • • 更好的可读性
    ULID 的 Base32 编码使其更短、更易读,便于在日志、调试信息或用户界面中显示。
  • • 更高的存储效率
    ULID 的字符串长度为 26 个字符,比 UUID 的 36 个字符短约 28%,在大规模存储场景中可以节省大量空间。
  • • 更好的索引性能
    由于 ULID 的时间戳部分是递增的,它在数据库中插入时会保持索引的顺序性,从而提高查询性能。

5. 使用

使用开源库 Ulid 来生成和操作 ULID。

5.1 安装 NuGet 包

通过 NuGet 安装 NUlid 库:

dotnet add package NUlid

5.2 生成 ULID

使用 Ulid.NewUlid() 方法生成一个新的 ULID:

using NUlid;
var ulid = Ulid.NewUlid();
Console.WriteLine("生成的 ULID: " + ulid);
//生成的 ULID: 01JRS29BZ18KWK6TDPSKMB93ZY

5.3 从时间戳生成 ULID

基于指定的时间生成 ULID:


var timestamp = DateTimeOffset.UtcNow;
var ulid = Ulid.NewUlid(timestamp);
Console.WriteLine("基于时间生成的 ULID: " + ulid);
// 基于时间生成的 ULID: 01JRS2APB4C2JG7Y2X6D89XRDZ

5.4 解析 ULID

ULID 可以解析出时间戳部分:

using NUlid;

var ulid = Ulid.NewUlid();
Console.WriteLine("ULID: " + ulid);
Console.WriteLine("时间戳: " + ulid.Time.ToString("o"));
//ULID: 01JRS2BPS42D6VX1AYQZJFMQZQ
//时间戳: 2025 - 04 - 14T02: 34:23.9080000 + 00:00

6. ULID 的应用场景

  1. 1. 日志系统
    使用 ULID 作为日志的唯一标识符,便于按时间顺序存储和查询。
  2. 2. 分布式系统
    在分布式系统中,ULID 可以作为全局唯一的标识符,同时支持时间排序。
  3. 3. 数据库主键
    使用 ULID 替代 UUID 作为主键,优化索引性能并节省存储空间。
  4. 4. 事件流处理
    在事件驱动架构中,ULID 可以确保事件按时间顺序处理。

7. 总结

ULID 是 UUID 的一种优秀替代方案,特别适合需要时间排序、高性能索引和更高可读性的场景。在 C# 中,使用 ULID 可以显著提升系统的性能和可维护性。 通过合理使用 ULID,开发者可以构建更高效、更可靠的分布式系统和应用程序。

 


该文章在 2025/4/16 15:02:54 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved