Java中UUID的使用

朱英范
2023-12-01

一. UUID的概念

          UUID是由机器借助设备的网卡地址、时间戳、命名空间、随机数或伪随机数以及时序,经过一系列算法运算,从而得到的一串字符串。虽然在特定的范围内重复的可能性极小,但并不意味着UUID一定不会重复,重复的概率和避免重复的范围与UUID的类型(使用的算法)有关:

         1. UUID Version1: 基于时间的UUID。通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用,也可以使用退化的算法,以IP地址来代替MAC地址--Java的UUID往往是这样实现的(当然也考虑了获取MAC的难度)。

        2.  UUID Version2: DCE安全的UUID。DCE(Distributed Computing Environment)安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。

        3. UUID Version3: 基于名字的UUID。 基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。 使用的是MD5算法。

        4. UUID Version4: 随机UUID。根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的。

        5. UUID Version5: 基于名字的UUID。和版本3的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。

        从UUID的不同版本中可以看出:Version 1/2适合应用于分布式计算环境下,具有高度的唯一性;Version 3/5适合于一定范围内名字唯一,且需要或可能会重复生成UUID的环境下。

二. UUID的使用

      算法1的使用方式:

        1. 引入外部依赖——java-uuid-generator

<dependency>
    <groupId>com.fasterxml.uuid</groupId>
    <artifactId>java-uuid-generator</artifactId>
    <version>3.2.0</version>
</dependency>

        2. 使用方式

// 传入网卡信息,基于时间制作出生成器
TimeBasedGenerator generator = Generators.timeBasedGenerator(EthernetAddress.fromInterface());
UUID uuid = generator.generate();
// 通过计算当前时间戳、随机数和机器MAC地址得到,由于使用了MAC地址,因此这个版本的随机数能够保证全球唯一
System.out.println(uuid.version()); // 1
System.out.println(uuid.toString().replaceAll("-", ""));

      算法3的使用方式: 

// "123"是由自己指定的
System.out.println(UUID.nameUUIDFromBytes("123".getBytes()).version()); // 3
System.out.println(UUID.nameUUIDFromBytes("123".getBytes()));

      算法4的使用方式:

System.out.println(UUID.randomUUID().version()); // 4

 

 类似资料: