Java Top.

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程

1.概述

uuid.(普遍唯一的标识符),也称为GUID(全球唯一标识符)代表对于所有实用目的,128位长值是唯一的。UUID的标准表示使用十六进制数字(八位字节):

123E4567-E89B-12D3-A456-556642440000

UUID由十六进制数字(每个4个字符)以及4“ - ”符号组成,使其成为符号长度等于36个字符。

NIL UUID是一种特殊形式的UUID,其中所有位都设置为零。

在本教程中,我们将看看uuid.java类。首先,我们将看到如何使用该类本身。然后我们将查看不同类型的UUID以及我们如何在Java中生成它们。

进一步阅读:

java中的charsequence vs.字符串

了解CharSequence和String之间的差异。

在字符串上使用char []数组以操纵Java中的密码?

探索我们不应该使用字符串来存储密码并使用char []数组的几个原因。

Java字符串池指南

了解JVM如何优化分配给Java String池中的字符串存储的内存量。

2.uuid.班级

UUID类具有单个构造函数:

UUID UUID =新的UUID(长度最重要的64位,长期值为64bits);

如果我们想使用此构造函数,我们需要提供两个长值。但是,它要求我们为自己构建UUID的位模式。

为方便起见,有三种静态方法创建UUID。

此第一个方法从给定字节数组创建一个版本3UUID:

uuid uuid = uuid.nameuuidfrombytes(byte []字节);

第二,randomuuid()方法创建一个版本4 UUID。这是创建UUID的最方便的方法

uuid uuid = uuid.randomuuid();

第三个静态方法返回一个uuid对象给出给定uuid的字符串表示:

UUID UUID = UUID.FROMSTRING(String UUIDHEXDIGITSTRING);

我们现在看看UUID如何构建。

3.结构

让我们参加一个例子uuid:

123E4567-E89B-42D3-A456-556642440000 XXXXXXXX-XXXX-BXXX-AXXX-XXXXXXXXXXXX

3.1。UUID Variant.

一种表示确定UUID的布局的变体。UUID中的所有其他位取决于变体字段中的位的设置。该变体由三个最高有效位确定:

MSB1 MSB2 MSB3 0 x x保留(0)1 0 x电流变量(2)1 0为Microsoft(6)保留1 1 1为将来(7)

的价值一种在上述UUID中是“A”。“a”(= 10xx)的二进制等同物示出了变体为2。

3.2。UUID版本

B.代表版本。提到的UUID中的版本(值B.)是4。

Java提供了获取Variant和UUID版本的方法:

uuid uuid = uuid.randomuuid();int variant = uuid.variant();int版本= uuid.version();

这些是五种不同版本的变体2 uuids:基于时间(UUIDv1),DCE安全(UUIDv2),基于名称(UUIDv3和UUIDv5),随机(UUIDv4)。

Java为V3和V4提供了一个实施,但也提供了一个构造函数用于生成任何类型的UUID:

UUID UUID =新的UUID(长度长度,长度最低尺寸);

4. UUID版本

4.1。版本1

UUID版本1基于当前时间戳,以10月15日的10月15日,1582年以100纳秒为单位测量,与创建UUID的设备的MAC地址相连。

如果隐私是一个问题,则可以替代地使用随机48位数而不是MAC地址生成UUID版本1。在本文中,我们将看看这种替代方案。

首先,我们将生成64个最小值和最高高位的位数:

私有静态Long Get64LeastSignificantBitsforversion1(){随机随机=新Aquand();长random63BitLong = random.nextLong()&0x3FFFFFFFFFFFFFFFL;long variant3bitflag = 0x8000000000000000000L;返回Aquary63bitlong + Variant3bitFlag;私有静态LONG GET64MOSTSIGNICATINGBITSFORVERSSVERSSVERSTER_(){localDateTime start = localDateTime.of(1582,10,15,0,0,0);持续时间=持续时间。(start,localdatetime.now());龙秒= duration.getSeconds();long nanos = duration.getnano();长时间foruuuidin100nanos =秒* 10000000 +纳米* 100;LONG INHOLL INGEL12SIGNIFICATATOFTIME =(timeforuuuidin100NANOS&0x00000000000000FFFFL)>> 4; long version = 1 << 12; return (timeForUuidIn100Nanos & 0xFFFFFFFFFFFF0000L) + version + least12SignificatBitOfTime; }

然后,我们可以将这两个值传递给UUID的构造函数:

公共静态UUID generateTeTeType1uuId(){long most64sigbits = get64messignificantifantbitsforversion1();LONG INHOLENT64SIGBITS = GET64LEASTSignificantBitsforversion1();返回新的UUID(大多数64sigbits,至少64个字符);}

4.2。版本2

版本2也基于时间戳和MAC地址。然而,RFC 4122.没有指定确切的生成详细信息,因此我们不会在本文中查看一个实施。

4.3。版本3和5

使用命名空间和名称的散列生成UUID。命名空间标识符是uuids,如域名系统(DNS),对象标识符(OID),URL等。

UUID =哈希(命名空间_ identifier + name)

UUIDv3和UUIDv5之间的唯一区别是散列算法 - V3使用MD5(128位),而V5使用SHA-1(160位)。

简单地说,我们将结果散列截断为128位,然后替换4位的版本和变量的2位。

让我们生成3型UUID:

字节[]命名空间= bytesfromuuId(命名空间);byte [] namebytes = name.getbytes(“utf-8”);byte []结果= jocybtes(命名空间,nameybytes);UUID UUID = UUID.NameUuIdFromBytes(结果);

这里,重要的是要注意命名空间的十六进制字符串首先需要转换为字节数组。

最后,Java没有提供类型5.检查我们的源代码存储库对于UUIDV5。

4.4。版本4.

UUIDv4实现使用随机数作为源。Java实现是SECURERANDOM.,它使用不可预测的值作为种子来生成随机数以减少碰撞的机会。

让我们生成第4版UUID:

uuid uuid = uuid.randomuuid();

让我们使用“SHA-256”和随机UUID生成一个唯一的键:

MessageGigest Salt = MessageGigest.getInstance(“SHA-256”);salt.update(uuid.randomuuid()。ToString()。GetBytes(“UTF-8”));字符串DIGEST = BYTESTOOHEX(salt.digest());

结论

在本文中,我们看到了UUID如何构建和有哪些变体和版本。

我们还学习了哪些版本Java提供了一个开箱即用的实现,并查找代码示例以生成其他版本。

并始终如一,可以使用源代码在github上

Java底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
评论在本文上关闭!