JAVA UUID学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29956725/article/details/87347634

 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) 标识符和名称生成;

    "版本4" UUID 使用随机性伪随机性生成。

UUID record layout
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());
        }

    }

}
 

猜你喜欢

转载自blog.csdn.net/qq_29956725/article/details/87347634
今日推荐