唯一ID:UUID 介绍与 google/uuid 库生成 UUID

UUID 即通用唯一识别码,是一种用于计算机系统中以确保全局唯一性的标识符。其标准定义于 RFC 4122 文档中。标准形式包含 32 个 16 进制数字,以连字符切割为五组,格式为 8-4-4-4-12,总共 36 个字符。(形如, d169aa7f-4a6e-4ee2-b073-8e46e29c72f3)。UUID 在生成时利用到了空间信息和时间信息的唯一性,几乎可以排除重复的可能性。并且 UUID 的生成不依赖于中央注册机构或协调机制。所以很适合在分布式系统中使用。通常被用于数据库中作为记录的唯一标识、在分布式系统中唯一标识资源或服务等(例如使用 Kraft 模式启动 Kafka 时,需要先给 Kafka 分配 UUID)。

变体

目前 UUID 常见的变体有:、变体1(RFC 4122)、变体2(Microsoft)。它们的主要差别在于二进制存储和传输的方式不同,变体1采用大端序作为二进制存储与传输,而变体2采用部分小端序的方式存储与传输。此外,两种变体代表变体的比特不同,即第 9 字节的高位不同(xxxxxxxx-xxxx-xxxx-Nxxx-xxxxxxxxxxxx 即此处的 N 不同),变体1为8到b,变体2为c16或d16。

其中,最常见的变体为 RFC 4122 定义的变体1。

版本

根据 RFC 4122,UUID 有五种不同的版本:

  • 版本1: 基于时间和节点 ID 生成的 UUID
  • 版本2: DCE 安全的 UUID
  • 版本3: 通过命名空间标识符和名称进行散列得到的 UUID,使用 MD5 散列
  • 版本4: 随机生成的 UUID
  • 版本5: 通过命名空间标识符和名称进行散列得到的 UUID,使用 SHA-1 散列

不同版本的版本号标志在 UUID 的第 7 字节处(xxxxxxxx-xxxx-Mxxx-xxxx-xxxxxxxxxxxx 即此处的 M 即为版本号)

google/uuid 生成 UUID

版本1

版本1的 UUID 根据 60 比特的时间戳和节点的 48 比特 MAC 地址(尾部 12 个字符)组成。此外还有 14 比特的时钟序列用于扩展时间戳,以便处理处理器时钟不能足够快地前进的情况。剩下的 6 比特即为版本号和变体标志。(UUID 总长 128 比特)

利用 google/uuid 库的 NewUUID 接口即可生成 RFC 版本号为1的 UUID。

示例代码如下:

package mainimport ("fmt""github.com/google/uuid"
)func main() {// 生成一个新的 UUIDnewUUID, _ := uuid.NewUUID()fmt.Printf("Generated UUID: %s\n", newUUID)// 获取并打印UUID的变体variant := newUUID.Variant()fmt.Printf("UUID Variant: %d\n", variant)// 获取并打印UUID的版本version := newUUID.Version().String()fmt.Println(version)
}

版本4

版本4的 UUID 仍会使用 6 比特的空间标识版本号和变体标识,剩余的 122 比特随机生成,故版本4可以生成 2^122 种不同的 UUID,如此庞大的随机空间很难出现相同的 UUID,因此随机生成的 UUID 仍然能够提供足够的唯一性保证。

利用 google/uuid 库的 New 接口即可生成 RFC 版本号为4的 UUID。

示例代码如下:

package mainimport ("fmt""github.com/google/uuid"
)func main() {// 生成一个新的 UUIDnewUUID := uuid.New()fmt.Printf("Generated UUID: %s\n", newUUID)// 获取并打印UUID的变体variant := newUUID.Variant()fmt.Printf("UUID Variant: %d\n", variant)// 获取并打印UUID的版本version := newUUID.Version().String()fmt.Println(version)
}

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

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

相关文章

php 通过vendor文件 生成还原最新的composer.json

起因:因为历史原因,在本项目中composer.json基本算废了,没法直接使用composer管理扩展,今天尝试修复一下composer.json。 历史文件,可以看出来已经很久没有维护了,我们主要是恢复require的信息 {"na…

K8s节点维护流程

用途 用于下线异常节点、集群缩容等 操作步骤 1. 查看节点名称 先确认节点的名称 kubectl get node -o wide2. 设置节点不可调度 设置节点不可调度状态,禁止新的pod调度到该节点上 kubectl cordon ${node_name}3. 剔除节点上运行的pod(生产环境慎…

Spring Boot中集成Redis实现缓存功能

Spring Boot中集成Redis实现缓存功能 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨如何在Spring Boot应用程序中集成Redis,实现…

AP无法上线原因分析及排障

一、AP未分配到IP地址 如果遇到AP无法上线问题,可以检查下AP是否分配到IP地址。AP获取IP地址有两种方式:静态方式:登录到AP设备,手工配置IP地址,该方式操作起来比较麻烦,不推荐使用;DHCP方式&am…

基于CNN的股票预测方法【卷积神经网络】

基于机器学习方法的股票预测系列文章目录 一、基于强化学习DQN的股票预测【股票交易】 二、基于CNN的股票预测方法【卷积神经网络】 文章目录 基于机器学习方法的股票预测系列文章目录一、CNN建模原理二、模型搭建三、模型参数的选择(1)探究window_size…

下代iPhone或回归可拆卸电池,苹果这操作把我看傻了

刚度过一个愉快的周末,苹果又双叒叕摊上事儿了。 iPhone13 系列被曝扎堆电池鼓包了。 早在去年,就有 iPhone13 和 iPhone14 用户反馈过类似的问题,表示在手机仅仅使用了一年多的时间就出现了电池鼓包的情况,而且还把屏幕给撑起来了…

舞会无领导:一种树形动态规划的视角

没有上司的舞会 Ural 大学有 𝑁 名职员,编号为1∼𝑁。 他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。 每个职员有一个快乐指数,用整数 𝐻𝑖 给出,其中1≤&…

校园卡手机卡怎么注销?

校园手机卡的注销流程可以根据不同的运营商和具体情况有所不同,但一般来说,以下是注销校园手机卡的几种常见方式,我将以分点的方式详细解释: 一、线上注销(通过手机APP或官方网站) 下载并打开对应运营商的…

C++ 指针介绍

指针是C编程语言中的一个强大且重要的特性。它允许程序员直接操作内存地址,从而提供了对低级别内存的访问和控制。虽然指针在使用时可能比较复杂且容易出错,但它们在提高程序效率和灵活性方面有着不可替代的作用。本文将介绍C指针的基本概念、用法及其应…

Docker 中 MySQL 迁移策略(单节点)

目录 一、 简介二、操作流程2.1 进入mysql容器2.2 导出 MySQL 数据2.3. 将导出的文件复制到宿主机2.4 创建 Docker Compose 配置2.5 启动新的 Docker 容器2.6 导入数据到新的容器2.7 验证数据2.8 删除旧的容器(删除操作需慎重) 三、推荐配置四、写在后面…

当年很多跑到美加澳写代码的人现在又移回香港?什么原因?

当年很多跑到美加澳写代码的人现在又移回香港?什么原因? 近年来,确实有部分曾经移民到美国、加拿大、澳大利亚等地的香港居民选择移回香港。这一现象与多种因素相关,主要可以归结为以下几点: 疫情后的环境变化&#…

【STM32】温湿度采集与OLED显示

一、任务要求 1. 学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。 任务要求: 1)解释什么是“软件I2C”和“硬件I2C”?(阅读野火配…

2025第13届常州国际工业装备博览会招商全面启动

常州智造 装备中国|2025第13届常州国际工业装备博览会招商全面启动 2025第13届常州国际工业装备博览会将于2025年4月11-13日在常州西太湖国际博览中心盛大举行!目前,各项筹备工作正稳步推进。 60000平米的超大规模、800多家国内外工业装备制造名企将云集…

C++中的RAII(资源获取即初始化)原则

C中的RAII(Resource Acquisition Is Initialization,资源获取即初始化)原则是一种管理资源、避免资源泄漏的惯用法。RAII是C之父Bjarne Stroustrup提出的设计理念,其核心思想是将资源的获取(如动态内存分配、文件句柄、…

最细最有条理解析:事件循环(消息循环)是什么?进程与线程的定义、关系与差异

目录 事件循环:引入 一、浏览器的进程模型 1.1、什么是进程(Process) 1.2、什么是线程(Thread) 1.3、进程与线程之间的关系联系与区别 二、浏览器有哪些进程和线程 2.1、浏览器的主要进程 ①浏览器进程 ②网络…

ctfshow sqli-libs web561--web568

web561 ?id-1 or 1--?id-1 union select 1,2,3--?id-1 union select 1,(select group_concat(column_name) from information_schema.columns where table_nameflags),3-- Your Username is : id,flag4s?id-1 union select 1,(select group_concat(flag4s) from ctfshow.f…

扩展学习|风险评估和风险管理:回顾其基础上的最新进展

文献来源:[1]Aven, T. (2016). Risk assessment and risk management: Review of recent advances on their foundation. European journal of operational research, 253(1), 1-13. 文章简介:大约30-40年前,风险评估和管理被确立为一个科学领…

数据结构 - C/C++ - 链表

目录 结构特性 内存布局 结构样式 结构拓展 单链表 结构定义 节点关联 插入节点 删除节点 常见操作 双链表 环链表 结构容器 结构设计 结构特性 线性结构的存储方式 顺序存储 - 数组 链式存储 - 链表 线性结构的链式存储是通过任意的存储单元来存储线性…

技术分享:分布式数据库DNS服务器的架构思路

DNS是企业数字化转型的基石。伴随微服务或单元化部署的推广,许多用户也开始采用分布式数据库将原来的单体数据库集群服务架构拆分为大量分布式子服务集群,对应不同的微服务或服务单元。本文将从分布式数据库DNS服务器的架构需求、架构分析两方面入手&…

1_插入排序_循环不变式

01_插入排序 #include<stdio.h>void insert_sort(int arr[], int n); void printArray(int arr[], size);int main() {int arr[] {1, 2, 3, 22, 5, 9};int n sizeof(arr) / sizeof(arr[0]);printf("打印原始数组:\n");prinfArray(arr, n);insert_sort(arr, …