【Java进阶篇】什么是UUID,能不能保证唯一?

在这里插入图片描述

什么是UUID,能不能保证唯一?

  • ✔️典型解析
    • ✔️优缺点
  • ✔️各个版本实现
    • ✔️V1.基于时间戳的UUID
    • ✔️V2.DCE(Distributed Computing Environment)安全的UUID
    • ✔️V3.基于名称空间的UUID(MD5)
    • ✔️V4.基于随机数的UUID
    • ✔️V5.基于名称空间的UUID(SHA1)
    • ✔️各个版本总结


✔️典型解析


UUID(Universally Unique ldentifier)全局唯一标识符,是指在一台机器上生成的数字,它的目标是保证对在同一时空中的所有机器都是唯一的。


UUID 的生成是基于一定算法,通常使用的是随机数生成器或者基于时间戳的方式,生成的 UUID 由32位16讲制数表示,共有 128 位(标准的UUID格式为: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(8-4-4-4-12),共32个字符)。


由于 UUID 是由 MAC 地址、时间戳、随机数等信息生成的,因此 UUID 具有极高的唯一性,可以说是几乎不可能重复,但是在实际实现过程中,UUID有多种实现版本,他们的唯一性指标也不尽相同。


UUID在具体实现上,有多个版本,有基于时间的UUID V1,基于随机数的 UUID V4 等。


Java中的 java.util.UUID 生成的UUIDV3V4两种:


在这里插入图片描述


✔️优缺点


UUID的优点就是他的性能比较高,不依赖网络,本地就可以生成,使用起来也比较简单。


但是他也有两个比较明显的缺点,那就是长度过长和没有任何含义。长度自然不必说,他有32位16进制数字。对于"550e8400-e29b-41d4-a716-446655440000" 这个字符由来说,我想任何一个程序员都看不出其表达的含义。一旦使用它作为全局唯一标识,就意味着在日后的问题排查和开发调试过程中会遇到很大的困难。


✔️各个版本实现


✔️V1.基于时间戳的UUID


基于时间的 UUID 通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性


但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用,也可以使用退化的算法,以IP地址来代替MAC地址。


import java.util.UUID;public class Main {public static void main(String[] args) {long timestamp = System.currentTimeMillis();UUID uuid = UUID.nameUUIDFromBytes(Long.toString(timestamp).getBytes());System.out.println(uuid);}
}

在这个例子中,我们首先获取当前的时间戳(以毫秒为单位),然后将其转换为字符串。然后,我们将这个字符串转换为一个字节数组,并使用这个字节数组来生成一个 UUID。最后,我们打印出这个 UUID

然而,这个方法并不是基于时间戳生成唯一的 UUID ,因为UUID的生成是基于随机数和时间戳的。如果你需要基于时间戳生成唯一的UUID,你可能需要使用其他的方法,比如使用java.nio.file.attribute.FileTime类来获取一个更精确的时间戳,然后将其转换为UUID


✔️V2.DCE(Distributed Computing Environment)安全的UUID


和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIXUIDGID,这个版本的UUID在实际中较少用到。


✔️V3.基于名称空间的UUID(MD5)


基于名称的 UUID 通过计算名称和名称空间的 MD5 散列值得到。


这个版本的 UUID 保证了: 相同名称空间中不同名称生成的 UUID 的唯一性;不同名称空间中的 UUID 的唯一性;相同名称空间中相同名称的 UUID 重复生成得到的结果是相同的


✔️V4.基于随机数的UUID


根据随机数,或者伪随机数生成 UUID 。该版本 UUID 采用随机数生成器生成,它可以保证生成的 UUID 具有极佳的唯一性。但是因为基于随机数的,所以,并不适合数据量特别大的场景。


✔️V5.基于名称空间的UUID(SHA1)


和版本3的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。


✔️各个版本总结


可以简单总结一下,Version 1Version 2 这两个版本的UUID,主要基于时间和MAC地址,所以比较适合应用于分布式计算环境下,具有高度唯一性。


Version 3Version 5 这两种 UUID 都是基于名称空间的,所以在一定范围内是唯一的,而且如果有需要生成重复 UUID 的场景的话,这两种是可以实现的。


Version 4 这种是最简单的,只是基于随机数生成的,但是也是最不靠谱的。适合数据量不是特别大的场景下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/588767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学生管理系统(vue + springboot)

学生管理系统(vuespringboot)资源-CSDN文库 项目介绍 这是一个采用前后端分离开发的项目,前端采用 Vue 开发、后端采用 Spring boot Mybatis 开发。 项目部署 ⭐️如果你有 docker 的话,直接 docker compose up 即可启动&#…

SpringBoot入门指南(学习笔记)

概述 Springboot是Spring的一个子项目,用于快速构建Spring应用程序 入门 ①创建SpringBoot工程 ②编写Controller RestController public class HelloContoller {RequestMapping("/hello")public String hello() {return "hello";} }③运行…

golang锁源码【只有关键逻辑】

条件锁 type Cond struct {L Lockernotify notifyList } type notifyList struct {wait uint32 //表示当前 Wait 的最大 ticket 值notify uint32 //表示目前已唤醒的 goroutine 的 ticket 的最大值lock uintptr // key field of the mutexhead unsafe.Pointer //链表头…

论文解读:Coordinate Attention for Efficient Mobile Network Design(CVPR2021)

论文前言 原理其实很简单,但是论文作者说得很抽象,时间紧的建议直接看3.1中原理简述CBMA、原理简述CBMA以及3.2中原理简述coordinate attention block即可。 Abstract 最近关于mobile network设计的研究已经证明了通道注意(例如,the Squee…

java中file类常用方法举例说明

java中file类常用方法举例说明 当使用 java.io.File 类时,以下是一些常用方法的举例说明: 创建文件或目录: // 使用路径名创建File实例 File file new File("C:\\Users\\UserName\\Documents\\example.txt");// 使用父路径和子路…

JAVA-ArrayList的相关坑

ArrayList的asList()方法 Arrays.asList()方法,本质是调用了Arrays的一个静态内部类,实现了AbstractList接口,这个方法是重写了AbstractList的方法,但是这个asList()大小是固定的,当我们使用add方法时会调用父类Abstr…

roslaunch格式

The roslaunch package comes with roslaunch tool as well as several support tools to assist in the process of launching ROS Nodes. 目录 roslaunch Launch syntaxPassing in argsNon-launch optionsInternal-use only optionsEnvironment Variables (advanced users)…

23. 一维数组

写在前面: 今天是2023年12月31日,也是整个2023年的最后一天。我在CSDN上只有短短几个月的时光,但非常感谢大家的支持,作为一名刚刚大一的大学生呢,学习编程,学习写博客是很重要的事,所以在新的…

翻页的电子画册如何制作

​在过去,一本精美的画册往往需要大量的人力物力去印刷、装帧、运输。而现在,只需一台电脑、一个网址和一个创意,就可以轻松制作出一本电子画册。这种变化不仅降低了成本,还带来了更多的便利性和灵活性。 首先,你需要选…

网络故障排查和流量分析利器-Tcpdump命令

Tcpdump是一个在Unix/Linux系统上广泛使用的命令行网络抓包工具。它能够捕获经过网络接口的数据包,并将其以可读的格式输出到终端或文件中。Tcpdump是一个强大的命令行工具,能够捕获和分析网络数据包,为网络管理员和安全专业人员提供了深入了…

【网络面试(6)】IP协议对网络包的转发

在前面的博客中,我们提到过,网络传输的报文是有真实的数据包和一些头部组成,目前我们了解的头部就有TCP头、IP头、MAC头,而且这三个头部信息都是在应用程序委托给协议栈之后,被写入的相关信息,这些头部都是…

Leetcode4-唯一元素的和(1748)

1、题目 (1748)给你一个整数数组 nums 。数组中唯一元素是那些只出现 恰好一次 的元素。 请你返回 nums 中唯一元素的 和 。 示例 1: 输入:nums [1,2,3,2] 输出:4 解释:唯一元素为 [1,3] ,…

修改jenkins的目录(JENKINS_HOME)

默认JENKINS_HOME是/var/lib/jenkins/ 现要修改为/home/jenkins_data/jenkins 最开始 sudo cp -a /var/lib/jenkins/ /home/jenkins_data/ 然后如下操作: 1、首先 /etc/sysconfig/jenkins:jenkins配置文件,“端口”,“JENKIN…

9、python-闭包

简介 1.闭包,又称闭包函数或者闭合函数,其实和嵌套函数类似 2.不同之处在于,闭包中外部函数返回的不是一个具体的值,而是一个函数 3.一般情况下,返回的函数会赋值给一个变量,这个变量可以在后面被继续执行…

yolov8知识蒸馏代码详解:支持logit和feature-based蒸馏

文章目录 1. 知识蒸馏理论2. yolov8 蒸馏代码应用2.1 环境配置2.2 训练模型(1) 训练教师模型(2) 训练学生模型baseline(3) 蒸馏训练3. 知识蒸馏代码详解3.1 蒸馏参数设置3.2 蒸馏损失代码讲解3.2.1 Feature based loss3.2.1 Logit loss3.3 获取蒸馏的feature map及channels

08-接口文档管理工具-项目集成knife4j__ev

2、knife4j快速入门 2.1 knife4j介绍 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍! gitee地址:knife4j: Knife4j是一个集Swagger2 和 OpenAPI3为一体的增…

第二十六周:学习笔记

第二十六周:学习笔记 摘要Abstract全卷积网络 FCN1. CNN 与 FCN2. 全连接层 --> 成卷积层3. FCN的缺点 摘要 全卷积神经网络(Fully Convolutional Network,FCN)是一种用于图像分割和语义分割任务的深度学习模型。与传统的卷积…

使用python快速开发与PDF文档对话的Gemini聊天机器人

检索增强生成(Retrieval-augmented generation,RAG)使得我们可以让大型语言模型(LLMs)访问外部知识库数据(如pdf,word、text等),从而让人们可以更加方便的通过LLM来学习外部数据的知识。今天我们将利用之前学习到的RAG方法,谷歌Gemini模型和l…

费曼学习法应用:谈自私和教育的引导

今天这个还是来源于我和九迁的对话,起因是中午吃饭的时候,九迁在学校与班主任老师和数学老师对话中带来的思考。 先听音频: 对话内容(以下内容可以边听边看,属于语音转换过来的文字,最后有个总结&#xff0…

U4_3 语法分析-自底向上分析-LR0/LR1/SLR分析

文章目录 一、LR分析法1、概念2、流程3、LR分析器结构及分析表构造1)结构2)一些概念 二、LR(0)分析法1、流程2、分析动作1)移近2)归约(reduce) 3、总结1)LR分析器2)构造DFA3)构造LR(0)的方法(三…