ULID-分布式系统中生成全局唯一标识符更好的选择
创始人
2025-07-14 08:21:26
0

ULID与UUID

ULID (Universally Unique Lexicographically Sortable Identifier) 是一种用于生成全局唯一标识符的算法。它结合了时间戳和随机数,以便生成的标识符在排序时能够按照时间顺序排列。ULID 的格式为 48 个字符的字符串,其中包含 10 个时间戳字符和 16 个随机数字符。

ULID 的格式如下:

01AN4Z07BY      79KA1307SR9X4MV3
|----------|    |----------------|
 Timestamp           Randomness
  10 chars           16 chars

ULID 的时间戳部分使用当前时间与 Unix Epoch (1970-01-01) 的差值来表示,而随机数部分则使用随机生成的字符来确保唯一性。

ULID 的设计目的是为了在分布式系统中生成全局唯一标识符,并且能够在数据库中进行排序和索引。

UUID(Universally Unique Identifier)是一种128位的标识符,通常用于唯一标识信息。它是由一组数字和字母组成的32个字符的字符串,通常以连字符分隔为五段,形如8-4-4-4-12的格式。UUID的生成算法保证了在所有的时间和空间中都是唯一的。

在计算机科学中,UUID经常用于分布式系统中的唯一标识,比如数据库中的主键、消息队列中的消息标识等。UUID的唯一性和分散性使得它在分布式系统中具有很高的价值。

UUID有不同的版本:

  1. UUIDv1:基于时间戳和MAC地址生成,可能存在隐私安全风险。
  2. UUIDv3:基于名字空间和名称的MD5散列值生成。
  3. UUIDv4:基于随机数生成,具有较高的唯一性。
  4. UUIDv5:基于名字空间和名称的SHA-1散列值生成。

每个版本的UUID都有特定的生成算法和格式要求,用于确保生成的UUID在分布式系统范围内是唯一的。

ULID对比UUID

ULID是一种用于生成全局唯一标识符的算法,它结合了时间戳和随机数,以便在分布式系统中生成排序良好的唯一标识符。ULID的格式为26个字符的字符串,其中包含了时间戳和随机数。

相比之下,UUID是一种标准化的全局唯一标识符,它通常基于随机数或者基于时间戳和计算机的MAC地址等信息生成。UUID的格式为32个字符的字符串,通常以32位的十六进制数字表示。

ULID相对于UUID的优势在于它是可排序的,因为它包含了时间戳信息,这使得在分布式系统中对生成的标识符进行排序和检索更加高效。而UUID则更加偏向于全局唯一性,但在分布式系统中可能会存在排序和检索的性能问题。

ULID特性和规范

  1. 「全局唯一性」:ULID生成的标识符在全局范围内是唯一的,可以用于标识数据记录、实体或事件。
  2. 「按字典顺序可排序」:ULID是按照时间戳和随机数生成的,因此可以按照字典顺序进行排序,适合用作数据库主键或索引。
  3. 「可读性」:ULID使用了基于Crockford's Base32的编码,因此生成的标识符可以以字符串形式呈现,并且相对易读。
  4. 「时间有序性」:ULID的前部分包含了时间戳信息,因此可以根据ULID推断出生成时的时间。

ULID的格式通常为01AN4Z07BY,由10位时间戳和16位随机数组成。其具体生成算法可以参考ULID规范。

ULID规范:

  1. 128位长度,由时间戳和随机数组成。
  2. 使用时间戳来保证排序,使用随机数来保证唯一性。
  3. 采用Crockford's Base32编码,用于生成可打印的ASCII字符串。

ULID的格式如下:

01AN4Z07BY      79KA1307SR9X4MV3
|----------|    |----------------|
 Timestamp           Randomness
   10 chars           16 chars

ULID的时间戳部分使用当前时间与Unix纪元(1970-01-01)的差值来表示,精确到毫秒级。随机数部分使用安全的随机数生成算法来保证唯一性。ULID的设计旨在在分布式系统中生成全局唯一标识符,并且可以按时间排序。

  1. 时间戳:占据前48位,是一个自增的UTC时间戳,精确到毫秒。
  2. 随机数:占据后80位,使用随机数生成算法生成的随机数。

ULID的组成如下:

ULID由32个可打印字符组成,使用Crockford's Base32编码表示。具体格式为:

tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt

其中,前面的时间戳部分占据了前面的48位,后面的随机数部分占据了后面的80位。

ULID应用

ULID通常应用于需要生成全局唯一标识符并且需要按时间排序的各种分布式系统场景,例如:

  1. 数据库主键:在分布式系统中,可以将ULID作为数据库表的主键,确保每条记录都有唯一标识,并且可以按照生成时间进行排序。
  2. 日志跟踪:在日志系统中,可以使用ULID作为日志条目的唯一标识符,便于跟踪和排序日志。
  3. 分布式系统中的事务标识:在分布式系统中,可以使用ULID作为事务的唯一标识符,确保每个事务都有全局唯一的标识。

在Java中使用ULID需要在项目中添加ULID库的依赖,可以使用Maven或Gradle进行添加。

使用Maven添加ULID库的依赖:


    de.huxhorn.sulky
    de.huxhorn.sulky.ulid
    2.0.0

使用Gradle添加ULID库的依赖:

implementation 'de.huxhorn.sulky:de.huxhorn.sulky.ulid:2.0.0'

添加好ULID库的依赖,就可以在Java代码中使用ULID来生成唯一标识符。

import de.huxhorn.sulky.ulid.ULID;

public class Main {
    public static void main(String[] args) {
        ULID.Value ulid = new ULID().nextValue();
        System.out.println(ulid);
    }
}

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...