Java 和 UUID:编写可靠的唯一标识符

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("蜗牛"));
    }
}

运行结果如下:

版本 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

本文教程到此结束,祝愿小伙伴们在编程之旅中能够愉快地探索、学习、成长!

猜你喜欢

转载自blog.csdn.net/u011374856/article/details/130641515