Java UUID 五个版本的区别及使用场景小结

 更新时间:2024年11月01日 11:46:06   作者:爱吃土豆的程序员  
在Java中,UUID是一个128位的唯一标识符,广泛应用于生成唯一标识符、分布式系统唯一键等场景,Java提供的java.util.UUID类支持五种UUID版本,每种具有不同的生成方式和使用场景,本文就来介绍一下如何使用,感兴趣的可以了解一下

在Java中,UUID(Universally Unique Identifier)是一个128位的唯一标识符,广泛用于各种应用场景中,如生成唯一的标识符、分布式系统中的唯一键等。Java的java.util.UUID类提供了多种生成UUID的方法,这些方法分别对应不同的UUID版本。本文将详细介绍Java UUID的五个版本的区别及其使用场景,并结合示例代码进行说明。

Java UUID 的五个版本

UUID规范定义了五种不同类型的UUID,每种类型都有其特定的生成方式和使用场景。以下是这五个版本的详细说明:

Version 1 (时间戳UUID)

生成方式: 基于时间戳和节点标识符(通常是MAC地址)生成。

格式xxxxxxxx-xxxx-1xxx-xxxx-xxxxxxxxxxxx

使用场景: 需要生成具有时间顺序的唯一标识符,例如日志记录、审计追踪等。

示例代码:

import java.util.UUID;

public class UUIDVersion1Example {
    public static void main(String[] args) {
        // 生成一个版本1的UUID
        UUID uuid = UUID.nameUUIDFromBytes(("example").getBytes());
        System.out.println("Generated Version 1 UUID: " + uuid);
    }
}

Version 2 (DCE Security UUID)

生成方式: 基于POSIX UID/GID、时间戳和节点标识符生成。

格式xxxxxxxx-xxxx-2xxx-xxxx-xxxxxxxxxxxx

使用场景: 主要用于DCE(Distributed Computing Environment)安全应用中。

示例代码:

import java.util.UUID;

public class UUIDVersion2Example {
    public static void main(String[] args) {
        // 生成一个版本2的UUID(Java标准库不直接支持,需要自定义实现)
        UUID uuid = UUID.fromString("1e4d5a6b-cdef-2abc-def0-1234567890ab");
        System.out.println("Generated Version 2 UUID: " + uuid);
    }
}

Version 3 (名称空间UUID)

生成方式: 基于MD5哈希算法和名称空间生成。

格式xxxxxxxx-xxxx-3xxx-xxxx-xxxxxxxxxxxx

使用场景: 需要根据特定的名称和名称空间生成唯一的标识符,例如生成URL的唯一标识符。

示例代码:

import java.util.UUID;

public class UUIDVersion3Example {
    public static void main(String[] args) {
        // 生成一个版本3的UUID
        UUID namespaceUUID = UUID.fromString("12345678-1234-1234-1234-123456789012");
        String name = "example";
        UUID uuid = UUID.nameUUIDFromBytes((namespaceUUID.toString() + name).getBytes());
        System.out.println("Generated Version 3 UUID: " + uuid);
    }
}

Version 4 (随机UUID)

生成方式: 基于随机数生成。

格式xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx

使用场景: 需要生成完全随机的唯一标识符,例如生成数据库的主键、临时文件名等。

示例代码:

import java.util.UUID;

public class UUIDVersion4Example {
    public static void main(String[] args) {
        // 生成一个版本4的UUID
        UUID uuid = UUID.randomUUID();
        System.out.println("Generated Version 4 UUID: " + uuid);
    }
}

Version 5 (名称空间UUID)

生成方式: 基于SHA-1哈希算法和名称空间生成。

格式xxxxxxxx-xxxx-5xxx-xxxx-xxxxxxxxxxxx

使用场景: 类似于版本3,但使用SHA-1哈希算法,生成的UUID更加安全和稳定。

示例代码:

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;

public class UUIDVersion5Example {
    public static void main(String[] args) {
        // 生成一个版本5的UUID
        UUID namespaceUUID = UUID.fromString("12345678-1234-1234-1234-123456789012");
        String name = "example";
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            byte[] hashBytes = md.digest((namespaceUUID.toString() + name).getBytes(StandardCharsets.UTF_8));
            long msb = 0;
            long lsb = 0;
            for (int i = 0; i < 8; i++) {
                msb = (msb << 8) | (hashBytes[i] & 0xFF);
            }
            for (int i = 8; i < 16; i++) {
                lsb = (lsb << 8) | (hashBytes[i] & 0xFF);
            }
            msb &= 0x0FFFFFFFFFFFFFFFL;
            msb |= 0x5000000000000000L;
            lsb &= 0x3FFFFFFFFFFFFFFFL;
            lsb |= 0x8000000000000000L;
            UUID uuid = new UUID(msb, lsb);
            System.out.println("Generated Version 5 UUID: " + uuid);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

总结

Java UUID的五个版本各有其特点和适用场景:

  • Version 1: 适用于需要生成具有时间顺序的唯一标识符的场景。
  • Version 2: 主要用于DCE安全应用中。
  • Version 3: 适用于需要根据特定名称和名称空间生成唯一标识符的场景。
  • Version 4: 适用于需要生成完全随机的唯一标识符的场景。
  • Version 5: 类似于Version 3,但使用SHA-1哈希算法,生成的UUID更加安全和稳定。

通过理解和选择合适的UUID版本,开发者可以更好地满足不同应用场景的需求,提高系统的可靠性和安全性。希望本文的介绍和示例代码能帮助你更好地理解和使用Java UUID。

到此这篇关于Java UUID 五个版本的区别及使用场景小结的文章就介绍到这了,更多相关Java UUID使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot application.yml配置文件示例详解

    Spring Boot application.yml配置文件示例详解

    本文详细介绍了SpringBootapplication.yml配置文件的使用和配置项,通过学习本文,您应该已经掌握了如何使用application.yml文件来配置SpringBoot应用程序的不同组件,如数据源、数据库、缓存、邮件服务等,感兴趣的朋友一起看看吧
    2025-02-02
  • swagger注解@ApiModelProperty失效情况的解决

    swagger注解@ApiModelProperty失效情况的解决

    这篇文章主要介绍了swagger注解@ApiModelProperty失效情况的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • SpringBoot和Redis实现Token权限认证的实例讲解

    SpringBoot和Redis实现Token权限认证的实例讲解

    这篇文章主要介绍了SpringBoot和Redis实现Token权限认证的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 深入理解java线程通信

    深入理解java线程通信

    开发中不免会遇到需要所有子线程执行完毕通知主线程处理某些逻辑的场景。或者是线程 A 在执行到某个条件通知线程 B 执行某个操作。下面我们来一起学习如何解决吧
    2019-05-05
  • Java Session会话追踪原理深入分析

    Java Session会话追踪原理深入分析

    web开发阶段我们主要是浏览器和服务器之间来进行交互。浏览器和服务器之间的交互就像人和人之间进行交流一样,但是对于机器来说,在一次请求之间只是会携带着本次请求的数据的,但是可能多次请求之间是会有联系的,所以提供了会话机制
    2022-11-11
  • Java同学找工作最懵圈的问题:到底啥是分布式系统开发经验?(推荐)

    Java同学找工作最懵圈的问题:到底啥是分布式系统开发经验?(推荐)

    这篇文章主要介绍了分布式系统开发经验,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java之格式化输出实践

    Java之格式化输出实践

    这篇文章主要介绍了Java之格式化输出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-04-04
  • Java的Spring框架的三种连接池的基本用法示例

    Java的Spring框架的三种连接池的基本用法示例

    这篇文章主要介绍了Java的Spring框架的三种连接池的基本用法示例,Spring框架是Java下注明的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-11-11
  • MyBatisPlus @TableName表名注解的基本操作

    MyBatisPlus @TableName表名注解的基本操作

    @TableName注解是MyBatis-Plus中用于指定实体类与数据库表映射关系的重要工具,通过使用@TableName注解,可以明确地指定表名,支持多级表名和动态表名,本文给大家介绍MyBatisPlus @TableName表名注解的相关操作,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • Spring Boot REST国际化的实现代码

    Spring Boot REST国际化的实现代码

    本文我们将讨论如何在现有的Spring Boot项目中添加国际化。只需几个简单的步骤即可实现Spring Boot应用的国际化,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10

最新评论