UUID/GUID介绍、生成规则及生成代码

2023-05-16

UUID/GUID介绍、生成规则及生成代码

  • 1. UUID介绍
    • 1.1 介绍
    • 1.2 UUID优势
    • 1.3 UUID劣势
  • 2. UUID版本
    • 2.1 版本1 - 基于时间的UUID
      • 2.1.1优点
      • 2.1.2 缺点
      • 2.1.3 生成规则
    • 2.2 版本2 - 分布式安全的UUID
      • 2.2.1 优点
      • 2.2.2 缺点
      • 2.2.3 生成规则
    • 2.3 版本3 - 基于名字空间的UUID(MD5版)
      • 2.3.1 优点
      • 2.3.2 缺点
      • 2.3.3 生成规则
    • 2.4 版本4 - 基于随机数的UUID
      • 2.4.1 优点
      • 2.4.2 缺点
      • 2.4.3 生成规则
    • 2.5 版本5 - 基于名字空间的UUID(SHA1版)
      • 2.5.1 优点
      • 2.5.2 缺点
      • 2.5.3 生成规则
  • 3. UUID生成代码
  • 4. GUID介绍
  • 5. GUID 生成规则
  • 6. GUID 生成代码
    • 6.1 C#
    • 6.2 SQL server

1. UUID介绍

1.1 介绍

  • UUID全称为:Universally Unique IDentifier(通用唯一识别码)
  • UUID算法的目的是为了生成某种形式的全局唯一ID来标识系统中的任一元素,尤其在分布式环境下,该ID需要不依赖中心认证即可自动生成全局唯一ID。
  • UUID是由一组32位数的16进制数字所构成,故UUID理论上的总数为1632=2128,约等于3.4 x 1038。也就是说若每纳秒(ns)产生1万亿个UUID,要花100亿年才会将所有UUID用完。
  • UUID的标准型式包含32个16进制数字,以连字号分为五段,形式为 8-4-4-4-12 的32个字符。示例:
    550e8400-e29b-41d4-a716-446655440000
  • RFC 4122 为UUID 定义了统一资源名称(URN)名字空间。作为URN呈现的UUID如下:
    urn:uuid:123e4567-e89b-12d3-a456-426655440000

1.2 UUID优势

  • 无需网络,单机自行生成
  • 速度快,QPS高(支持100ns级并发)
  • 各语言均有相应实现库供直接使用

1.3 UUID劣势

  • String存储,占空间,DB查询及索引效率低
  • 无序,可读性差
  • 根据实现方式不同可能泄露信息

2. UUID版本

  • 版本 1/2 适用于需要高度唯一性且无需重复的场景;
  • 版本 3/5 适用于一定范围内唯一且需要或可能会重复生成UUID的环境下;
  • 版本 4 适用于对唯一性要求不太严格且追求简单的场景。

2.1 版本1 - 基于时间的UUID

2.1.1优点

能基本保证全球唯一性

2.1.2 缺点

使用了Mac地址,因此会暴露Mac地址和生成时间

2.1.3 生成规则

基于时间的UUID为例先梳理UUID的结构:
UUID为32位的十六机制数,因此实际上是16-byte (128-bit),各位分别为:

在这里插入图片描述

时间值:在基于时间的UUID中,时间值是一个60位的整型值,对应UTC的100ns时间间隔计数,因此其支持支持一台机器每秒生成10M次。在UUID中,将这60位放置到了15~08这8-byte中(除了09位有4-bit的版本号内容)。

版本号:版本号即上文所说的五个版本,在五个版本的UUID中,都总是在该位置标识版本,占据 4-bit,分别以下列数字表示:

在这里插入图片描述

因此版本号这一位的取值只会是1,2,3,4,5

变体值:表明所依赖的标准(X表示可以是任意值):
在这里插入图片描述

时钟序列:在基于时间的UUID中,时钟序列占据了07~06位的14-bit。不同于时间值,时钟序列实际上是表示一种逻辑序列,用于标识事件发生的顺序。在此,如果前一时钟序列已知,则可以通过自增来实现时钟序列值的改变;否则,通过(伪)随机数来设置。主要用于避免因时间值向未来设置或节点值改变可能导致的UUID重复问题。

节点值:在基于时间的UUID中,节点值占据了05~00的48-bit,由机器的MAC地址构成。如果机器有多个MAC地址,则随机选其中一个;如果机器没有MAC地址,则采用(伪)随机数。

2.2 版本2 - 分布式安全的UUID

2.2.1 优点

能保证全球唯一性

2.2.2 缺点

很少使用,常用库基本没有实现

2.2.3 生成规则

将基于时间的UUID(版本1)中时间戳前四位换为POSIX的UID或GID,其余保持一致。

2.3 版本3 - 基于名字空间的UUID(MD5版)

2.3.1 优点

不同名字空间或名字下的UUID是唯一的;相同名字空间及名字下得到的UUID保持重复。

2.3.2 缺点

MD5碰撞问题,只用于向后兼容,后续不再使用

2.3.3 生成规则

将命名空间 (如DNS、URL、OID等) 及名字转换为字节序列;
通过MD5散列算法将上述字节序列转换为16字节哈希值 (MD5散列不再推荐,SHA1散列的20位只使用其15~00位);
将哈希值的 3~0 字节置于UUID的15~12位;
将哈希值的 5~4 字节置于UUID的11~10位;
将哈希值的 7~6 字节置于UUID的09~08位,并用相应版本号覆盖第9位的高4位 (同版本1位置);
将哈希值的 8 字节置于UUID的07位,并用相应变体值覆盖其高2位 (同版本1位置);
将哈希值的 9 字节置于UUID的06位 (原时钟序列位置);
将哈希值的 15~10 字节置于UUID的05~00位 (原节点值位置)。

2.4 版本4 - 基于随机数的UUID

2.4.1 优点

实现简单

2.4.2 缺点

重复几率可计算

2.4.3 生成规则

生成16byte随机值填充UUID。重复机率与随机数产生器的质量有关。若要避免重复率提高,必须要使用基于密码学上的假随机数产生器来生成值才行;
将变体值及版本号填到相应位置。

2.5 版本5 - 基于名字空间的UUID(SHA1版)

2.5.1 优点

不同名字空间或名字下的UUID是唯一的;相同名字空间及名字下得到的UUID保持重复。

2.5.2 缺点

SHA1计算相对耗时

2.5.3 生成规则

将命名空间 (如DNS、URL、OID等) 及名字转换为字节序列;
通过SHA1散列算法将上述字节序列转换为16字节哈希值 (MD5散列不再推荐,SHA1散列的20位只使用其15~00位);
将哈希值的 3~0 字节置于UUID的15~12位;
将哈希值的 5~4 字节置于UUID的11~10位;
将哈希值的 7~6 字节置于UUID的09~08位,并用相应版本号覆盖第9位的高4位 (同版本1位置);
将哈希值的 8 字节置于UUID的07位,并用相应变体值覆盖其高2位 (同版本1位置);
将哈希值的 9 字节置于UUID的06位 (原时钟序列位置);
将哈希值的 15~10 字节置于UUID的05~00位 (原节点值位置)。

3. UUID生成代码

go代码如下

package main

import (
	"fmt"

	"github.com/google/uuid"
)

func UUIDv1() uuid.UUID {
	id, err := uuid.NewUUID()
	if err != nil {
		panic(err)
	}
	return id
}

func UUIDv2G() uuid.UUID {
	id, err := uuid.NewDCEGroup()
	if err != nil {
		panic(err)
	}
	return id
}

func UUIDv2P() uuid.UUID {
	id, err := uuid.NewDCEPerson()
	if err != nil {
		panic(err)
	}
	return id
}

func UUIDv3(data []byte) uuid.UUID {
	id, err := uuid.NewDCEPerson()
	if err != nil {
		panic(err)
	}
	return uuid.NewMD5(id, data)
}

func UUIDv4() uuid.UUID {
	return uuid.New()
}

func UUIDv5(data []byte) uuid.UUID {
	id, err := uuid.NewDCEPerson()
	if err != nil {
		panic(err)
	}
	return uuid.NewSHA1(id, data)
}

func main() {
	fmt.Println("---------------UUIDv1---------------")
	for i := 0; i < 5; i++ {
		fmt.Println(UUIDv1())
	}
	fmt.Println("---------------UUIDv2G--------------")
	for i := 0; i < 5; i++ {
		fmt.Println(UUIDv2G())
	}
	fmt.Println("---------------UUIDv2P--------------")
	for i := 0; i < 5; i++ {
		fmt.Println(UUIDv2P())
	}
	fmt.Println("---------------UUIDv3---------------")
	for i := 0; i < 5; i++ {
		fmt.Println(UUIDv3([]byte("encrypted")))
	}
	fmt.Println("---------------UUIDv4---------------")
	for i := 0; i < 5; i++ {
		fmt.Println(UUIDv4())
	}
	fmt.Println("---------------UUIDv5---------------")
	for i := 0; i < 5; i++ {
		fmt.Println(UUIDv5([]byte("encrypted")))
	}
}

4. GUID介绍

GUID有两种解释:1.就是UUID 2.特指微软对UUID标准的实现(可能是v4,后文介绍)。可以具体语境去辨析是哪个意思。
GUID就是UUID的依据,可以参照以下:

  • 维基百科上直接把GUID进行了重定向到UUID页面。
  • GUID(也称为UUID)是一个 16 字节的结构,旨在用作对象的唯一标识符。此处引用微软官方文档。
  • cxx 类型定义中也可以看到UUID和GUID等价。
 typedef struct _GUID {
   unsigned long Data1;
   unsigned short Data2;
   unsigned short Data3;
   byte Data4[8];
 } GUID,
   UUID,
  *PGUID;

5. GUID 生成规则

参考文章
作者采用如下C#代码进行测试

/// <summary>
/// Simple script to check whether a C# Guid is really a UUID version 4.
/// </summary>
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine($"{"Current",-10}{"Errors found",-10}");
        Console.WriteLine($"{"-------",-10}{"------------",-10}");

        var errorsFound = 0;

        for (var i = 0; i < 10_000_000; i++)
        {
            var guid = Guid.NewGuid();
            var uuidVersion = guid.ToString().Substring(14, 1);
            var isVersion4 = uuidVersion == "4";

            if (!isVersion4)
            {
                errorsFound += 1;
            }

            Console.Write($"\r{i, -10}{errorsFound, -10}   ");
        }

        Console.WriteLine();

        Console.ReadKey();
    }
}

结果显示

Current   Errors found
-------   ------------
9999999   0

猜测总归不是看了源码,所以我们只能做出如下结论:

GUID极可能是UUIDv4

6. GUID 生成代码

如果使用微软官方提供的API,有两种方式获取GUID

6.1 C#

在C#中 微软专门提供了一个Guid结构 来帮助人们生成GUID,命名空间为 System中 使用C#生成GUID的方法如下:
使用如下方法生成:
Guid.NewGuid()
如果要转换成为字符串使用,则可以使用如下方法:
Guid.NewGuid().ToString(string format)
其中 format 指示如何格式化GUID的格式 可以有不同的参数"N",“D”,“P”,“B”,null,当选择null时使用默认的参数"D"
使用C#语言生成 如下:

 string guid1 = Guid.NewGuid().ToString("N");
 string guid2 = Guid.NewGuid().ToString("D");
 string guid3 = Guid.NewGuid().ToString("P");
 string guid4 = Guid.NewGuid().ToString("B");

6.2 SQL server

比较运算符可与 uniqueidentifier 值一起使用。不过,排序不是通过比较两个值的位模式来实现的。可针对 uniqueidentifier 值执行的运算只有比较运算(=、<>、<、>、<=、>=)以及检查是否为 NULL(IS NULL 和 IS NOT NULL)。不能使用其他算术运算符。除 IDENTITY 之外的所有列约束和属性均可对 uniqueidentifier 数据类型使用。
具有更新订阅的合并复制和事务复制使用 uniqueidentifier 列来确保在表的多个副本中唯一地标识行。
sql server中 生成 GUID的时候 使用如下方法生成:

-- Creating a local variable with DECLARE/SET syntax.
DECLARE @myid uniqueidentifier
SET @myid = NEWID()
PRINT 'Value of @myid is: '+ CONVERT(varchar(255), @myid)

输出结果为:

Value of @myid is: 9A09488E-7D1D-4995-9A7D-3AFB736CA3FE

注意,NEWID 对每台计算机返回的值各不相同。所显示的数字仅起解释说明的作用。
要想使用SQL server和C#中生成一样格式,在C#中要使用默认的参数"D",才能使SQL server 和C#中的格式一致

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UUID/GUID介绍、生成规则及生成代码 的相关文章

  • 服务器端获取webservice客户端IP地址

    一 基于xfire发布的webservice获取客户端ip的方法 public String getClientIp String ip 61 34 34 try HttpServletRequest request 61 XFireSer
  • @Autowired,@Qualifier @Required @Resource @Component,@Service,@Controller,@Repository @PostConstruct

    1 64 Autowired 注解 xff1a 首先在使用时候需要引入配置 xff1a lt 该 BeanPostProcessor 将自动起作用 xff0c 对标注 64 Autowired 的 Bean 进行自动注入 gt lt bea
  • HTML中select标签单选多选详解

    select 元素可创建单选或多选菜单 当提交表单时 xff0c 浏览器会提交选定的项目 xff0c 或者收集用逗号分隔的多个选项 xff0c 将其合成一个单独的参数列表 xff0c 并且在将 lt select gt 表单数据提交给服务器
  • Centos7中语言如何设置成中文

    Centos系统作为开源最优秀的Linux版本 xff0c 我们在阿里云官方镜像站 xff1a https developer aliyun com mirror 找到所需Centos版本并下载安装后 xff0c 可能未注意指定系统语言 x
  • Tomcat正常启动,访问所有页面均报404异常,404异常总结

    今天遇到一个问题 xff1a Tomcat正常启动 xff0c 访问所有页面均报404异常 404异常 xff0c 很常见 xff0c 大多情况是路径错误 web xml文件映射路径写错 服务器设置 servlet的jar包未导进去或者没有
  • oracle中游标详细用法

    游标的概念 游标是SQL的一个内存工作区 xff0c 由系统或用户以变量的形式定义 游标的作用就是用于临时存储从数据库中提取的数据块 在某些情况下 xff0c 需要把数据从存放在磁盘的表中调到计算机内存中进行处理 xff0c 最后将处理结果
  • 连接2个字符串,strcat函数。

    题目描述 设计函数连接2个字符串 单个字符串的长度不超过100 不要使用系统提供的strcat函数 输入要求 输入2个字符串 xff0c 每个字符串以换行符结束 保证每个字符串中不会出现空格 输出要求 输出连接好的字符串 输入样例 Coun
  • git 下载指定历史版本

    1 选中想回退到的commit记录 xff0c 点击如图 2 选中Hard xff0c 表示该记录之后的改动全部丢弃 3 操作完之后代码会回滚到选中的位置 xff0c 这个时候不要拉取代码 xff0c 不然又拉回来了 xff1b 直接在现有
  • 摄像机内参、外参矩阵

    摄像机矩阵由P由内参矩阵和外参矩阵组成 xff0c 对摄像机矩阵进行QR分解可以得到内参矩阵和外参矩阵 在opencv的3D重建中 xff08 opencv中文网站中 xff1a 照相机定标与三维场景重建 xff09 xff0c 对摄像机的
  • 几个简单的数据点平滑处理算法

    最近在写一些数据处理的程序 经常需要对数据进行平滑处理 直接用FIR滤波器或IIR滤波器都有一个启动问题 xff0c 滤波完成后总要对数据掐头去尾 因此去找了些简单的数据平滑处理的方法 在一本老版本的 数学手册 中找到了几个基于最小二乘法的
  • 陶哲轩实分析 3.5 节习题试解

    3 5 1 第一种定义 xff1a x y 61
  • C++ 中的 std::pair 和 std::tuple

    C 43 43 中的 std pair 和 std tuple 最近在看 C 43 43 11 的标准 xff0c 发现了 std pair 和 std tuple 感觉这两个非常有用 就在这里记录一下 std pair 出现的比较早 xf
  • OpenCV 真圆度测量

    OpenCV 真圆度测量 最近一个项目需要在图像上测量一些小孔的真圆度 因此专门研究了一下真圆度计算问题 对于一个轮廓 xff0c 我们可以求出这个轮廓的外接圆和内切圆 这两个圆的半径差定义为真圆度 这个数值越小 xff0c 表示这个圆越标
  • 如何修改 CentOS 系统最大线程数

    简介 xff1a 本文主要介绍如何修改CentOS系统最大线程数 镜像下载 域名解析 时间同步请点击 阿里巴巴开源镜像站 1 安装ElasticSearch后 xff0c 配置完成 xff0c 启动服务 xff0c 系统显示类似如下 max
  • MathJax 支持的 Latex 符号总结(各种箭头符号)

    箭头符号 latex显示效果 uparrow downarrow Uparrow Downarrow updownarrow Updownarrow rightarrow
  • C++ 复制构造函数不能用 explicit 修饰

    最近在写的一个代码 出现个莫名其妙的编译问题 代码可以简化成这样 xff1a class foo span class hljs keyword public span span class hljs title foo span span
  • FreeRTOS 源码注释(vTaskDelete)

    void vTaskDelete xTaskHandle pxTaskToDelete tskTCB pxTCB taskENTER CRITICAL if pxTaskToDelete 61 61 pxCurrentTCB pxTaskT
  • 循环冗余校验(CRC)算法入门引导

    写给嵌入式程序员的循环冗余校验 xff08 CRC xff09 算法入门引导 前言 CRC校验 xff08 循环冗余校验 xff09 是数据通讯中最常采用的校验方式 在嵌入式软件开发中 xff0c 经常要用到CRC 算法对各种数据进行校验
  • FreeRTOS 移植要点(2)

    port c port c 中主要实现了几个函数 xff1a pxPortInitialiseStack xPortStartScheduler vPortEndScheduler vPortYield vPortTickInterrupt
  • DLA (扩散限制凝聚)模型的计算机模拟

    几年前写的一个小程序 xff0c 最近找到了 程序写的比较简单 xff0c 也没做什么优化 对正在学习计算物理的同学可能会有点帮助 下面关于DLA 模型的介绍来自百度百科 Diffusion limited Aggregation xff0

随机推荐

  • matlab 读取处理 wav 文件

    最近工作需要 xff0c 要对wav 文件中存储的声音信息进行分析处理 所以花了些时间收集了各种数学软件中处理 wav 文件的方法 Matlab Matlab 是最方便的 甚至于不用写任何代码就能读取 wav 文件 xff08 我用的是 m
  • Savitzky-Golay 滤波器

    Savitzky Golay滤波器 xff08 通常简称为S G滤波器 xff09 最初由Savitzky 和 Golay 于 1964 年提出 xff0c 发表于Analytical Chemistry 杂志 之后被广泛地运用于数据流平滑
  • 关于查看ros中可以安装的功能包

    可以通过以下命令查看软件库中是否包含你所需要的功能包 apt cache search xxxx 其中xxx为你要搜索的关键字
  • 教你如何用原生css和html搭建一个好看的Table表格

    前言 大家在学习 lt table gt 标签的时候 xff0c 可能还没有接触css xff0c 所以你做出来的表格可能是这样的 xff1a 或者是这样的 xff1a 大家有想过自己做一个漂亮的表格吗 xff1f 我知道大家在做项目的时候
  • 如何在 Ubuntu 20.04 启用 SSH

    简介 xff1a Secure Shell SSH 是一个网络协议 xff0c 它主要被用来加密客户端和服务端之间的连接 在客户端和服务端的每一次交互都被加密 本文主要为大家讲解如何在 Ubuntu 20 04 启用 SSH 镜像下载 域名
  • 树莓派镜像SD卡烧录成功磁盘没内容解决方法

    这个情况很可能是删除分区后发生的 xff0c 只需要此电脑 管理 磁盘管理 驱动器路径 添加 确定就可以解决了
  • C++ 类学习总结(五) 继承与多态

    继承 基本概念 xff0e 基类 xff1a 可供其他类继承的类 xff0c 基类的成员也将成为派生类的成员 xff0e 派生类 xff1a 从基类继承而来的类 xff0c 称为派生类 xff0e 虚函数 xff1a 基类中希望其派生类可以
  • 行业术语 英文

    IDE 一般指集成开发的环境 如QT Creator Visual Studio等 Application framework 一般指的是应用程序框架 xff08 包含 XML xff0c GUI组件 xff0c 程序 xff0c 网络框架
  • VSCode C/C++ 格式化配置【最完整准确版本】

    一 下载Clang format 1 在VSCode插件商店下载 C C 43 43 插件 和 Clang format 插件 二 生成 clang format 文件 2 去到 C Users lt 你的用户名 gt vscode ext
  • 【时间规划】C/C++发展之路--读书

    0 xff1a 图书馆的N本C xff0c C 43 43 书 1 xff1a C语言深度解剖 2 xff1a 高质量C 43 43 c编程指南 3 xff1a C 43 43 primer第四版 4 xff1a Windows程序设计 5
  • 【Cocos2d-x】Win7+ vs2012,2010 + Cocos2d-x2.2 配置Cocos2d-X项目-环境

    新安装搭建cocos2d X的跳过这里 xff0c 看下面红色开始 xff1a cocos2d x删除vs2012项目模板 这一步新使用cocos2d x的不需要 如果你切换cocos2d x版本的话 xff0c 要将之前版本的vs模板删除
  • 【Cocos2d-x】Cocos2d-x参考案例源码解析之一:Cocos2dx各个文件说明

    这里本人电脑配置是win7 64位 xff0c cocos2d x2 20 xff0c VS2012 1 xff1a 首先当然是下载cocos2d x啦 我采用的是2 20版本 说明 xff1a 2 14以后的版本和之前的VS模板生成和环境
  • 【Cocos2d-x】Cocos2d-x参考案例源码解析之三:HelloWorld

    允许我讲些与源码无关的事情 xff01 稍后K我 由于cocos2dX3 0快出来了 xff0c 官网上说放弃objective c风格 xff0c 本屌学的是C 43 43 xff0c 所以真是太高兴了 xff0c 所以放慢的源码解析 x
  • 【Cocos2d-x】Cocos2d-x跨Android平台搭建之四:Win7 64位+ eclipse + cocos2dX

    开始研究cocos2dx xff0c mark一下这个的配置步骤 1 下载eclipse 2 下载android sdk xff0c 配置sdk路径 xff0c 添加环境变量 3 安装adt 4 下载android ndk xff0c 配置
  • 【网络通信】Wince 和 PC 通过USB 用Socket 进行通信

    网上资料比较少或者说讲的不太详细 xff0c 现在进行总结下 xff0c 刚毕业没接触过WINce xff0c 不过和MFC差不多 xff0c 现在进入正题 刚开始我的疑惑是Wince是如何和PC进行通信的 xff0c 以及能在USB模式下
  • 如何在 Ubuntu 20.04 上添加交换空间

    简介 xff1a 本文主要为大家讲解如何在 Ubuntu 20 04上添加并激活一个交换空间 镜像下载 域名解析 时间同步请点击 阿里巴巴开源镜像站 交换空间是硬盘上的一个空间 xff0c 当物理 RAM 内存被用尽时 xff0c 被紧急征
  • VScode+Sphinx+ReadTheDocs 从环境搭建到放弃

    概述 此篇博客用来记录在windows10中配置环境的过程 xff0c 注意是Windows下 xff0c 我没有在Linux下面尝试过配置 一下参考了各路教程加上自己亲测 xff0c 应该是没有问题的 被掏空 目录 概述 目录材料清单工具
  • 分布式游戏服务器设计

    分布式游戏服务器设计 服务器解释整体设计图网关服务器网络连接消息处理权限管理业务支持消息路由 登录服务器网络连接用户注册用户登录 中心服务器用户管理消息推送全局功能 游戏服务器数据读取数据落地消息处理 存储服务器工作模式数据一致性 依赖系统
  • Ubuntu 更新apt源及apt常用命令

    Ubuntu 更新apt源及常用命令 替换apt国内源更新软件包信息可更新的包信息更新所有包安装编译必备安装软件包查找软件包名查找包含文件的软件包名列出软件包的所有文件删除软件包 替换apt国内源 执行以下命令 span class tok
  • UUID/GUID介绍、生成规则及生成代码

    UUID GUID介绍 生成规则及生成代码 1 UUID介绍1 1 介绍1 2 UUID优势1 3 UUID劣势 2 UUID版本2 1 版本1 基于时间的UUID2 1 1优点2 1 2 缺点2 1 3 生成规则 2 2 版本2 分布式安