1、简介
UUID(通用唯一识别码)是一种用于唯一标识分布式系统中的对象的标准。它是一个128位的字符串,包含了时间戳和随机数字,可以保证在分布式系统中每个对象都有一个独特的标识符,而不会发生冲突。
UUID最常见的用途是在不同的系统和平台之间传递唯一的标识符,以便于对象的识别和管理。例如,在分布式文件系统中,每个文件都有一个唯一的UUID,以便于文件的组织和管理。
UUID的主要优势是它的唯一性和跨平台性。由于UUID是由计算机生成的,因此它可以保证在全球范围内的唯一性,而且可以在不同的系统和平台之间互相转换。此外,UUID还具有良好的随机性,可以确保生成的UUID在时间上具有较好的随机性,避免了因为时间相关的问题而产生的重复标识符。
常见的UUID生成算法包括:
微软公司的全局唯一标识符(GUID):这是最广泛使用的UUID之一,可以在任何系统中使用。
Linux ext2/ext3文件系统中的UUID:这些文件系统使用UUID作为文件系统标识符。
LUKS加密分区中的UUID:在Linux中,LUKS加密分区使用UUID作为分区标识符。
GNOME、KDE、Mac OS X等操作系统中的UUID:这些操作系统中也使用UUID作为标识符。
除了在操作系统和文件系统中使用UUID,还有一些其他的应用场景也使用UUID,例如在云计算、物联网等领域,UUID可以用于标识设备、服务、数据等。
2、组成格式
UUID的组成格式是:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)。其中,每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。
3、版本
UUID 的版本简介如下:
-
V1 (timestamp) :最早的版本,使用 Unix 时间戳作为 UUID 的一部分,时间戳不足会导致生成的 UUID 不可用。由于使用MAC地址,可以保证全球范围的唯一性。
-
V2 (timestamp) :在 v1 的基础上进行了优化,使用当前时间作为 UUID 的一部分,时间戳不足会导致生成的 UUID 不可用。同时,生成的 UUID 中也包含了更多的随机数字,提高了 UUID 的安全性。
-
V3 (namespace) :在 v2 的基础上增加了命名空间信息,可以根据不同的命名空间生成不同的 UUID。命名空间是一个16进制数字,可以包含零个、一个或多个十六进制数字。
-
V4 (random) :也是在 v2 的基础上进行了优化,生成的 UUID 更加随机化,避免了因为生成的 UUID 重复而产生的问题。
-
V5 (namespace) :在 v3 的基础上增加了命名空间信息,并将散列算法从 MD5 更改为 SHA1,提高了 UUID 的安全性和散列性能。
UUID 的版本按照升级顺序分为 v1、v2、v3、v4、v5,每个版本都有自己的特点和适用场景。在实际应用中,可以根据需要选择合适的版本来生成唯一的标识符。
4、Java 实现完整示例
package com.csdn.woniu.example;
import java.nio.charset.StandardCharsets;
import java.util.UUID;
/**
* <h1>UUID 示例代码</h1>
* Created by woniu
* */
public class UUIDExample {
/***
* <h2>空校验</h2>
* @param str 需要判断的值
*/
public static boolean isEmpty(Object str) {
return null == str || "".equals(str);
}
/***
* <h2>String 转 byte</h2>
* @param str 需要转换的字符串
*/
public static byte[] getBytes(String str){
if (isEmpty(str)) {
return null;
}
try {
return str.getBytes(StandardCharsets.UTF_8);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/***
* <h2>生成 UUID</h2>
* 版本 4(伪随机数生成器)的 UUID
*/
public static String getUUID(){
UUID uuid = UUID.randomUUID();
return uuid.toString();
}
/***
* <h2>生成 UUID</h2>
* 版本 3 的实现,对于给定的字符串(name)总能生成相同的UUID
*/
public static String getUUID(String name){
if (isEmpty(name)) {
return getUUID();
}
UUID uuid = UUID.nameUUIDFromBytes(getBytes(name));
return uuid.toString();
}
public static void main(String[] args) {
System.out.println("版本 4,随机:" + getUUID());
System.out.println("版本 3,您好:" + getUUID("您好"));
System.out.println("版本 3,您好:" + getUUID("您好"));
System.out.println("版本 3,蜗牛:" + getUUID("蜗牛"));
}
}
运行结果如下:文章来源:https://www.toymoban.com/news/detail-440800.html
版本 4,随机:a3cf9138-1fd2-428e-b78c-b334cc5da42d
版本 3,您好:f070aa69-f8d7-3650-9a15-a0f9d0878a41
版本 3,您好:f070aa69-f8d7-3650-9a15-a0f9d0878a41
版本 3,蜗牛:d905ce22-1175-3b2d-ae23-d97c9c26bc0c
对于相同的命名空间总是生成相同的UUID,版本为3,命名空间为 “您好” 时生成的 UUID 总是为 f070aa69-f8d7-3650-9a15-a0f9d0878a41文章来源地址https://www.toymoban.com/news/detail-440800.html
本文教程到此结束,祝愿小伙伴们在编程之旅中能够愉快地探索、学习、成长!
到了这里,关于Java 和 UUID:编写可靠的唯一标识符的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!