@Author:Guzi499
@QQ:504305797
@Date:2020/01/23
1.介绍
来源与功能
java.util.UUID
是 java1.5后引入的。
-
UUID 的目的是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。
-
如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。
组成
-
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。
-
按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字
-
UUID由以下几部分的组合:
-
当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
-
时钟序列。
-
全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
-
-
其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
(8-4-4-4-12)
2.使用
import java.util.UUID;
/**
* @author guzi
* @date 2021/1/23
*/
public class GzyTest {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
System.out.println(uuid);
//如果想去掉 '-' 且转换小写
String uuidString = uuid.toString().replace("-", "").toLowerCase();
System.out.println(uuidString);
}
}
运行结果:
1c2686ee-8cae-4fc8-9fa0-8e5d176f76bc
1c2686ee8cae4fc89fa08e5d176f76bc
3.使用到的源码
/**
* UUID.JAVA
*/
//The most significant 64 bits of this UUID.
private final long mostSigBits;
//The least significant 64 bits of this UUID.
private final long leastSigBits;
//constructor
private UUID(byte[] data) {
long msb = 0;
long lsb = 0;
assert data.length == 16 : "data must be 16 bytes in length";
for (int i=0; i<8; i++)
msb = (msb << 8) | (data[i] & 0xff);
for (int i=8; i<16; i++)
lsb = (lsb << 8) | (data[i] & 0xff);
this.mostSigBits = msb;
this.leastSigBits = lsb;
}
public static UUID randomUUID() {
SecureRandom ng = Holder.numberGenerator;
byte[] randomBytes = new byte[16];
ng.nextBytes(randomBytes);
randomBytes[6] &= 0x0f; /* clear version */
randomBytes[6] |= 0x40; /* set to version 4 */
randomBytes[8] &= 0x3f; /* clear variant */
randomBytes[8] |= 0x80; /* set to IETF variant */
return new UUID(randomBytes);
}
public String toString() {
return (digits(mostSigBits >> 32, 8) + "-" +
digits(mostSigBits >> 16, 4) + "-" +
digits(mostSigBits, 4) + "-" +
digits(leastSigBits >> 48, 4) + "-" +
digits(leastSigBits, 12));
}