1. UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写
UUID是由一组32位数的16进制数字所构成,是故UUID理论上的总数为16^32=2^128,约等于3.4 x 10^38。也就是说若每纳秒产生1兆个UUID,要花100亿年才会将所有UUID用完
2. java生成UUID的方法
UUID.randomUUID() //V4
UUID.nameUUIDFromBytes("890110866094329856".getBytes();//根据名称(V3)
结果: 45cfb563-6262-4d3a-a7a6-800eed2e158f
1. UUID 代表一个128bits的数,也就是 32 位十六机制组成的 16bytes 的数
2. UUID 由两部分组成(高64bits 和 低64bits)
高64bits(前面16位16进制数)
32bits(8位16进制数):time_low
16bits(4位16进制数):time_mid
4 bits (1位16进制数):version
12bits(3位16进制数):time_hi
低64bits(后面16位16进制数)
2bits (不够 1 位) :variant
14bits(3FFF) :clock_seq
48bits(12位16进制数):node
-
版本[编辑]
对于 "变体(variants)1" 和 "变体2",标准中定义了五个"版本(versions)",并且在特定用例中每个版本可能比其他版本更合适。
版本由 M 字符串中指示。
"版本1" UUID 是根据时间和节点 ID(通常是MAC地址)生成;
"版本2" UUID是根据标识符(通常是组或用户ID)、时间和节点ID生成;
"版本3" 和 "版本5" 确定性UUID 通过散列 (hashing) 名字空间 (namespace) 标识符和名称生成;
UUID | Position | Name | Length (bytes) | Length (hex digits) | Contents | |
---|---|---|---|---|---|---|
45cfb563-6262-4d3a-a7a6-800eed2e158f | 45cfb563 | time_low | 4 | 8 | 整数:低位 32 bits 时间 | |
6262 | time_mid | 2 | 4 | 整数:中间位 16 bits 时间 | ||
4d3a | 4表示版本 | time_hi_and_version | 2 | 4 | 最高有效位中的 4 bits“版本”,后面是高 12 bits 的时间 | |
d3a 表示时间 | ||||||
a7a6 | clock_seq_hi_and_res clock_seq_low | 2 | 4 | 最高有效位为 1-3 bits“变体”,后跟13-15 bits 时钟序列 | ||
800eed2e158f | node | 6 | 12 | 48 bits 节点 ID |
JAVA 默认只支持V3和V4(基于伪随机数)两种版本的实现
除了Java默认的实现之外,还有一个开源的UUID实现库可以参考:https://github.com/cowtowncoder/java-uuid-generator, 这个 库支持实现UUID的V1,V3,V4和V5版本,在需要使用到唯一性ID的地方可以酌情考虑使用
<dependency>
<groupId>com.fasterxml.uuid</groupId>
<artifactId>java-uuid-generator</artifactId>
<version>3.1.5</version>
</dependency>
package spring.utils;
import java.io.IOException;
import java.util.UUID;
import com.fasterxml.uuid.EthernetAddress;
import com.fasterxml.uuid.Generators;
import com.fasterxml.uuid.ext.FileBasedTimestampSynchronizer;
import com.fasterxml.uuid.impl.TimeBasedGenerator;
public class UUIDTest {
public static void main(String[] args) throws IOException {
FileBasedTimestampSynchronizer sync = new FileBasedTimestampSynchronizer();
EthernetAddress eth = EthernetAddress.fromInterface();
while (true) {
TimeBasedGenerator gen = Generators.timeBasedGenerator(eth, sync);
UUID uuid = gen.generate();
System.out.println(uuid.toString());
}
}
}