2

ULID-分布式系统中生成全局唯一标识符更好的选择

 3 months ago
source link: https://www.51cto.com/article/783554.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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库的依赖:

<dependency>
    <groupId>de.huxhorn.sulky</groupId>
    <artifactId>de.huxhorn.sulky.ulid</artifactId>
    <version>2.0.0</version>
</dependency>

使用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);
    }
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK