有关‘全局唯一id‘

news2024/12/23 19:29:43

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 多平台发布

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

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

相关文章

深入了解MySQL中的JSON_ARRAYAGG和JSON_OBJECT函数

在MySQL数据库中,JSON格式的数据处理已经变得越来越常见。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它可以用来存储和表示结构化的数据。MySQL提供了一些功能强大的JSON函数,其中两个关键的函数是…

HTML中name和class,id的区别和联系

在HTML中,name、class和id是用于标识和选择元素的属性。 区别: name属性:用于标识表单元素,特别是在提交表单时,用于识别表单数据。name属性可以在同一表单中的多个元素中重复使用。class属性:用于为一个…

品牌出海推广策略:海外网红营销和TikTok挑战赛的完美结合

随着全球化的深入,越来越多的品牌意识到在海外市场的存在至关重要。然而,进入国际市场并建立品牌知名度是一项复杂的任务,需要创新和多样化的策略。在这个数字化时代,品牌出海推广策略的一个令人兴奋的新趋势是将海外网红营销与Ti…

前端JavaScript Error 类: 异常处理与错误管理

🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 引言 1. Error 类简介 2. Error 类属性 3. Error 类的 API 4. Error 类的应用场景 5. 自定义错误类型 6. 注意…

如何在微软Edge浏览器上一键观看高清视频?

编者按:视频是当下最流行的媒体形式之一。但由于视频压缩、网络不稳定等原因,我们常常可以看到互联网上的很多视频其画面质量并不理想,尤其是在浏览器端,这极大地影响了观看体验。不过,近期微软 Edge 浏览器推出了一项…

万字长文总结检索增强 LLM

连接:https://zhuanlan.zhihu.com/p/655272123 ChatGPT 的出现,让我们看到了大语言模型 ( Large Language Model, LLM ) 在语言和代码理解、人类指令遵循、基本推理等多方面的能力,但幻觉问题 Hallucinations[1] 仍然是当前大语言模型面临的一…

【初阶数据结构】树结构与二叉树的基础概念

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,今天带来数据结构里的重点内容也是在笔试,面试中的常见考点——树与二叉树,其中二叉树又分为很多种,我们先来讲讲基础的内容带大家…

Notion+Zotero+Notero 联动教程(23年9月更新版)

准备 下载Zotero at https://www.zotero.org/ 下载Zotero Connector at https://www.zotero.org/download/connectors 下载Notion at https://www.notion.so/desktop 下载Notero at https://github.com/dvanoni/notero/releases 关系说明 Notion中的 database 与 Zotero 链接…

parse:uParse修复​​版,优化表格,css等,html富文本加载

https://ext.dcloud.net.cn/plugin?id364 自己搞微信小程序遇到的,uniapp 搞得 后台textarea富文本便捷器 录入的客户端显示,试了好几种都不行,尤其是表格图片排版的。

C++使用Boost库加入UDP组播时程序崩溃

程序崩溃情况 本程序运行在Oracle VM VirtualBox虚拟的Ubuntu20.04上 terminate called after throwing an instance of ‘boost::wrapexceptboost::system::system_error’ what(): set_option: No such device 已放弃 (核心已转储) ** C使用Boost库加入组播的代码 #inclu…

计算机视觉的应用15-图片旋转验证码的角度计算模型的应用,解决旋转图片矫正问题

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用15-图片旋转验证码的角度计算模型的应用,解决旋转图片矫正问题,在CV领域,图片旋转验证码的角度计算模型被广泛应用于解决旋转图片矫正问题,有效解决机…

腾讯mini项目-【指标监控服务重构】2023-07-20

今日已办 Trace otelzap :opentelemetry-go-extra/otelzap at main uptrace/opentelemetry-go-extra (github.com) go get github.com/uptrace/opentelemetry-go-extra/otelzap声明 Tracer ,一个应用创建一个 Tracer (需要从venus中来传来…

OGAI详解:AIStation调度平台如何实现大模型高效长时间持续训练

大模型是当前通用人工智能产业发展创新的核心技术,目前国内已发布的生成式AI模型超过了100个。面向以大模型为核心的生成式AI开发与应用场景,近日浪潮信息发布了大模型智算软件栈OGAI(Open GenAI Infra)——“元脑生智”&#xff…

【最新面试问题记录持续更新,java,kotlin,android,flutter】

最近找工作,复习了下java相关的知识。发现已经对很多概念模糊了。记录一下。部分是往年面试题重新整理,部分是自己面试遇到的问题。持续更新中~ 目录 java相关1. 面向对象设计原则2. 面向对象的特征是什么3. 重载和重写4. 基本数据类型5. 装箱和拆箱6. …

Java基础-异常处理

文章目录 异常机制的作用异常存在的形式 异常机制的作用 什么是异常,异常的作用?程序在执行的过程中发生了不正常的情况,而这种情况被称之为"异常"。Java语言是很完善的语言,提供了异常的处理方式:Java把异…

这所院校太好考了!地处魔都!不要错过!

一、学校及专业介绍 上海电力大学(Shanghai University of Electric Power),位于上海市,是中央与上海市共建、以上海市管理为主的全日制普通高等院校,是教育部首批“卓越工程师教育培养计划”试点院校、上海高水平地方…

STM32单片机—定时器产生PWM波

STM32单片机—PWM波 PWM波概述定时器产生PWM配置CubeMX配置产生PWM波Hal库产生PWM实现呼吸灯程序设计固件库PWM波程序配置及实现 PWM波概述 什么是PWM   PWM简称脉冲宽度调制,即在一个周期内存在不同极性的电平状态。PWM频率   是指一秒钟内从高电平时间在到低…

如何用ATECLOUD芯片测试系统测试电源芯片的振荡频率?

芯片振荡频率常用于数字电路和模拟电路中,它是影响芯片运行速度的重要因素,其大小与内部电容器、电感、晶体等元件的特性有关。一款芯片生产出来后,它的振荡频率大小总是会在固定的范围之内。因此,芯片的振荡测试不仅需要抓取频率…

CANoe-Model Editor无法修改ARXML文件的问题、E2E在SOME/IP通信中的使用问题

1、Model Editor无法修改ARXML文件的问题 在CANoe 15软件版本中,Communication Setup导入arxml文件后,可以在model editor中打开arxml并修改配置。关闭model editor后再打开,可以看到修改的配置被保存了。 但是,当我把arxml文件从Communication Setup中移除后,再导入。此…

云原生Kubernetes:pod进阶之资源管理与探针

目录 一、理论 1.pod的资源限制 2.健康检查(探针Probe) 3.示例 二、实验 1.pod的资源限制 2.健康检查(探针Probe) 三、问题 1.生成资源报错 2.api版本错误 3.echo N>/proc/sys/vm/drop_caches如何实现清理缓存 四、总结 一、理论 1.pod的…