有关‘全局唯一id‘

2023-11-06


UUID和Snowflake的对比


当需保证全局唯一的id,可以选用UUIDSnowflake(及其变种)

其中UUID 不依赖于任何第三方系统,性能和可用性上较好;

Snowflake生成的id具有单调递增性(可以拿到生成时的时间戳信息),能包含一定业务上的意义(如注册时间的长短),涉及到分表时用Snowflake更好。

alt

从占用数据库空间来说,Snowflake是将64bit 的二进制数字分成若干部分,因此如果用int类型存储,其最大为9223372036854775807,不超过int64的上限,如 1628304129979846657


alt

uuid的组成[1]

而UUID 是由 32 个 16 进制数字组成的字符串,如cd7460be-1593-41b1-9542-2b9a690f9dd2

snowflake算法 Demo:

package main

import (
   "fmt"

   "github.com/bwmarrin/snowflake"
)

func main() {

   // Create a new Node with a Node number of 1
   node, err := snowflake.NewNode(1)
   if err != nil {
      fmt.Println(err)
      return
   }

   // Generate a snowflake ID.
   id := node.Generate()

   // Print out the ID in a few different ways.
   fmt.Printf("Int64  ID: %d\n", id)
   fmt.Printf("String ID: %s\n", id)
   fmt.Printf("Base2  ID: %s\n", id.Base2())
   fmt.Printf("Base64 ID: %s\n", id.Base64())

   // Print out the ID's timestamp
   fmt.Printf("ID Time  : %d\n", id.Time())

   // Print out the ID's node number
   fmt.Printf("ID Node  : %d\n", id.Node())

   // Print out the ID's sequence number
   fmt.Printf("ID Step  : %d\n", id.Step())

   // Generate and print, all in one.
   fmt.Printf("ID       : %d\n", node.Generate().Int64())
}

输出:

Int64  ID: 1628304129979846656
String ID: 1628304129979846656
Base2  ID: 1011010011000111001011111101010100101110000000001000000000000
Base64 ID: MTYyODMwNDEyOTk3OTg0NjY1Ng==
ID Time  : 1677052931672
ID Node  : 1
ID Step  : 0
ID       : 1628304129979846657

UUID Demo:

package main

import (
   "fmt"

   "github.com/satori/go.uuid"
)

func main() {
   // Creating UUID Version 4
   // panic on error
   u1 := uuid.Must(uuid.NewV4(), nil)
   fmt.Printf("UUIDv4: %s\n", u1)

   // or error handling
   u2 := uuid.NewV4()
   fmt.Printf("UUIDv4: %s\n", u2)

   // Parsing UUID from string input
   u2, err := uuid.FromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8")
   if err != nil {
      fmt.Printf("Something went wrong: %s", err)
      return
   }
   fmt.Printf("Successfully parsed: %s", u2)
}

输出:

UUIDv4: cd7460be-1593-41b1-9542-2b9a690f9dd2
UUIDv4: 2c598a64-e685-4ab2-9021-9aa352aaefad
Successfully parsed: 6ba7b810-9dad-11d1-80b4-00c04fd430c8

UUID


alt


通用唯一识别码(英语:Universally Unique Identifier,缩写:UUID)[2]


UUID是由开放软件基金会(OSF)定义的一种标准,而GUID是微软对UUID这个标准的实现,目前被广泛采用。UUID还有其它各种实现,不止GUID一种。

生成的uuid是由一组 32位数 的16进制数字所构成,故uuid理论上的总数为16的32次方, 即2的128次方,约等于3.4 x 10的38次方。也就是说若每纳秒(ns)产生1兆个UUID,要花100亿年才会将所有uuid用完。

UUID的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的32个字符。示例:

550e8400-e29b-41d4-a716-446655440000

UUID的编码规则:

  • 1)1~8位采用系统时间,在系统时间上精确到毫秒级保证时间上的惟一性;
  • 2)9~16位采用底层的IP地址,在服务器集群中的惟一性;
  • 3)17~24位采用当前对象的HashCode值,在一个内部对象上的惟一性;
  • 4)25~32位采用调用方法的一个随机数,在一个对象内的毫秒级的惟一性。

通过以上4种策略可以保证惟一性。在系统中需要用到随机数的地方都可以考虑采用UUID算法。


最知名的标准是RFC4122[3]

很有意思的是这个标准没有第二版[4]

alt

uuid现在共有5个版本,版本1不够安全,版本4有可能发生重复,但概率极低.现在大多使用uuid4

UUID 不同版本的区别及选择[5]

alt

UUID4发生碰撞的概率:

alt

go版常用实现 uuid-rs/uuid[6]

alt

rust版常用实现 uuid-rs/uuid[7]

alt
alt

Twitter的Snowflake算法


[UUID和雪花(Snowflake)算法该如何选择?](https://cloud.tencent.com/developer/article/1766264 "UUID和雪花(Snowflake "UUID和雪花(Snowflake)算法该如何选择?")算法该如何选择?")

分布式ID生成方案--雪花算法和UUID对比[8]

几种分布式id生成方式[9]


其他方案实现「分布式环境下的全局唯一发号器」


图解各路分布式ID生成算法[10]

六种方式实现全局唯一发号器[11]

面试总被问分布式ID? 美团(Leaf)了解一下[12]

美团技术分享:深度解密美团的分布式ID生成算法[13]

面试总被问分布式ID怎么办? 滴滴(Tinyid)甩给他[14]


参考资料

[1]

uuid的组成: https://www.google.com/search?q=uuid&newwindow=1&sxsrf=AJOqlzW1mf2ohYNWjOwjuSh70Di0-aYINg:1677053193032&source=lnms&tbm=isch&sa=X&ved=2ahUKEwii7Nv-1aj9AhVNNt4KHQ7rCmQQ_AUoAXoECAEQAw&biw=1920&bih=990&dpr=1.8

[2]

通用唯一识别码(英语:Universally Unique Identifier,缩写:UUID): https://zh.wikipedia.org/wiki/%E9%80%9A%E7%94%A8%E5%94%AF%E4%B8%80%E8%AF%86%E5%88%AB%E7%A0%81

[3]

RFC4122: https://segmentfault.com/a/1190000000484508

[4]

没有第二版: https://docs.python.org/zh-cn/3.11/library/uuid.html

[5]

UUID 不同版本的区别及选择: https://www.jianshu.com/p/76e3a75605ed

[6]

uuid-rs/uuid: https://github.com/satori/go.uuid

[7]

uuid-rs/uuid: https://github.com/uuid-rs/uuid

[8]

分布式ID生成方案--雪花算法和UUID对比: https://blog.csdn.net/qq_40950903/article/details/108589837

[9]

几种分布式id生成方式: https://www.cnblogs.com/kuotian/p/12869914.html

[10]

图解各路分布式ID生成算法: https://i6448038.github.io/2019/09/28/snowflake/

[11]

六种方式实现全局唯一发号器: https://blog.csdn.net/qq_20051535/article/details/120072174

[12]

面试总被问分布式ID? 美团(Leaf)了解一下: https://juejin.im/post/5e61b4f26fb9a07cb83e2eee

[13]

美团技术分享:深度解密美团的分布式ID生成算法: https://zhuanlan.zhihu.com/p/83753710

[14]

面试总被问分布式ID怎么办? 滴滴(Tinyid)甩给他: https://cloud.tencent.com/developer/article/1598569

本文由 mdnice 多平台发布

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

有关‘全局唯一id‘ 的相关文章

  • 记录 BL-604 环境配置

    与两个朋友组队参加个比赛 第一次正经的参加比赛 弥补之前一些遗憾吧 随便记录一下 下载博流的开发包 https gitee com bouffalolab bl mcu sdk 注册平头哥 https occ t head cn auth
  • NandFlash介绍、操作流程分析以及S5PV210的NandFlash控制器介绍

    1 NandFlash的型号与命名 注 本文以S5PV210芯片和K9F2G08芯片做分析 1 Nand的型号命名都有含义 拿K9F2G08来示例分析一下 K9F表示是三星公司的NandFlash系列 2G表示Nand的大小是2Gbit 2
  • Tomcat 各安装包选择及使用情景。

    本文参考 Apache Tomcat 8 5 51 官方 README 文件 当我们进入 Tomcat 主页下载 Tomcat 时 会看到各种安装包的选择 Binary Distributions 二进制发行包 Core zip pgp s

随机推荐

  • QT/C++ 多线程时,工作界面的样式频繁改变导致程序奔溃的问题

    QT C 多线程时 工作界面的样式频繁改变导致程序奔溃的问题 一 错误现象与原因 最近在学习QT 遇到了一点问题 是关于工作线程与UI线程的 其主要问题为 我的工作线程是一个死循环 当我点击按钮进入工作线程 我的工作线程用emit发送一个信
  • IDEA使用JUnit时@Test无效以及无法导入org.junit包的一系列问题

    先找到idea的安装位置 进入lib文件夹 然后打开idea File gt Project Structure 选择Project Settings中的Libraries 点击如图 号 然后添加以下两个包 点击OK 添加成功就可以了 ht
  • 3.java 基础if语句测评题-答案

    知识点 java 基础if语句测评题 答案 题目1 训练 李雷想买一个价值7988元的新手机 她的旧手机在二手市场能卖1500元 而手机专卖店推出以旧换新的优惠 把她的旧手机交给店家 新手机就能够打8折优惠 为了更省钱 李雷要不要以旧换新
  • SQL-更新和删除数据

    如何使用UPDATE和DELETE语句进一步操作表数据 1 更新数据 更新 修改 表中的数据 使用UPDATE语句 更新表中的特定行 更新表中的所有行 注 不要省略WHERE子句 在使用UPDATE时一定要细心 因为稍微不注意 就会更新表中
  • ArcGIS教程:面积制表

    摘要 计算两个数据集之间交叉制表的区域并输出表 插图 使用方法 区域定义为输入中具有同样值的全部区 各区无需相连 栅格和要素数据集都可用于区域输入 假设区域输入和类输入均为具有同样分辨率的栅格 则可直接使用它们 假设分辨率不同 则可先应用内
  • AT指令(中文详解版)

    AT命令最常见的应用场景 1 智能手机 一般智能手机都是一个主芯片控制一个通信模块 这个通信模块就是一个完整的 简单的手机 包括手机应该有的射频 基带等部分 还有GSM协议栈 完全可以独立打电话 发短信 用GPRS上网等 主芯片实现复杂的应
  • 【GD32篇】新建KEIL工程

    以GD32f103C8T6芯片为例 一 下载MDK5 软件包 下载地址 https www keil com dd2 pack 1 选择工程所需的软件包 2 打开软件包 安装在KEIL5同路径下 3 安装成功后打开keil软件 可查看到自己
  • 经典Hive-SQL面试题及答案

    目录 第一题 求分区累加值 第二题 UV和每个店铺访问量top3信息 Hive sql解答 第一题 求分区累加值 我们有如下的用户访问数据 userId visitDate visitCount u01 2017 1 21 5 u02 20
  • 单片机C语言基础知识-指针篇

    引言 指针是变量在计算机或单片机内所占有的存储区域的地址 C51语言中广泛使用的指针概念是从C语言中继承下来的 利用指针变量不但可以操作各种基本的数据类型 而且能使C51语言像汇编语言一样 具有处理单片机内存地址的能力 地址 指针 指针变量
  • Paramiko远程操作Linux服务器

    在日常工作中我们经常会跟Linux打交道 对于测试同学来说 使用Linux的场景还是比较多的 比如 搭建测试环境 查看日志信息 修改配置文件 监控服务资源等 本篇将介绍一个Python的第三方库Paramiko 使用Paramiko 我们可
  • ChatGPT学python——制作自己的AI模型(一)初步了解

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 前端炫酷代码分享 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架构咱们从0说 数据流通的精妙之道 文章目录 前言 引
  • 离线环境下手动安装python环境的依赖包

    在写完python代码之后 想要部署到服务器上 但由于服务器无法连接外网 对应的服务器上也没有代码中用到的包 怎么进行手动安装 正是一件麻烦的事情 现在主要针对这样的情况介绍几种依赖包的手动安装 这里主要介绍flask和jieba的安装 关
  • opencv获取多个摄像头名字和编号

    https blog csdn net hyqwmxsh article details 74479694
  • 房地产不同视角

    author skate time 2012 08 14 房地产不同视角 房地产 你为啥看不懂 一 看现象与看本质 http blog sina com cn s blog 77479d2301015cpk html 房地产 你为啥看不懂
  • KMP例题

    KMP算法 实现两个字符串的匹配 KMP讲解 KMP模板 include
  • MinGW和 MinGW-W64的区别

    部分参照备忘录原文 bitbucket org FrankHB yslib src 50c3e6344a5a24b2382ce3398065f2197c2bd57e doc Workflow Annual2014 txt at master
  • 使用R语言进行柱状图可视化特征的种类和个数

    使用R语言进行柱状图可视化特征的种类和个数 柱状图是一种常用的数据可视化工具 用于展示变量 特征 的种类及其数量 通过柱状图 我们可以更直观地了解数据的分布情况和特征之间的差异 在R语言中 我们可以使用多种方法来创建柱状图 并对特征种类和个
  • 使用Excel实现数据驱动测试

    文章目录 1 概述 2 xlrd 3 openpyxl 4 pandas 5 如何在excel表格中描述多个用例 5 1 制定解析规则 5 2 创建测试用例 1 概述 测试类型 本质 数据类型 接口测试 数据流动和验证 csvyamljso
  • RTX2080ti配置tensorflow gpu版

    tensorflow gpu配置 昨晚搞到1点 终于把tensorflow gpu给配置成功了 之前是交给一位朋友搞的 我也懒得弄 结果还是没搞定 秉着万事靠自己的态度 终于 一边下军旗 一边配置成功了 首先 讲讲我个人的电脑配置 E3 1
  • 有关‘全局唯一id‘

    UUID和Snowflake的对比 当需保证全局唯一的id 可以选用UUID或Snowflake 及其变种 其中UUID 不依赖于任何第三方系统 性能和可用性上较好 Snowflake生成的id具有单调递增性 可以拿到生成时的时间戳信息 能