有关'全局唯一id'

简介: 有关'全局唯一id'

UUID和Snowflake的对比


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

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

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

微信截图_20230926104437.png

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

微信截图_20230926104448.png

uuid的组成

而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

微信截图_20230926104623.png

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


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

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

微信截图_20230926104637.png

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

UUID 不同版本的区别及选择

微信截图_20230926104722.png

UUID4发生碰撞的概率:

微信截图_20230926104736.png

go版常用实现 uuid-rs/uuid

微信截图_20230926104810.png

rust版常用实现 uuid-rs/uuid

微信截图_20230926104822.png

微信截图_20230926104830.png

Twitter的Snowflake算法


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

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

几种分布式id生成方式


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


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

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

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

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

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


目录
相关文章
|
1月前
|
存储 NoSQL 数据库
全局id生成方式
全局id生成方式
|
1月前
|
存储 C# 数据库
C# 生成唯一ID,有哪些方法?
【2月更文挑战第12天】
353 0
|
1月前
|
存储 缓存 算法
分布式全局id
分布式全局id
|
8月前
|
存储 算法 安全
场景应用:id全局唯一且自增,如何实现?
场景应用:id全局唯一且自增,如何实现?
125 0
|
10月前
|
存储 算法 安全
全局唯一ID(自增ID、UUID、雪花算法)
一、介绍 系统唯一id是我们在设计阶段常常遇到的问题。在复杂的分布式系统中,几乎都需要对大量的数据和消息进行唯一标识。在设计初期,我们需要考虑日后数据量的级别,如果可能会对数据进行分库分表,那么就需要有一个全局唯一id来标识一条数据或记录。生成唯一id的策略有多种,但是每种策略都有它的适用场景、优点以及局限性。
|
存储
4.3全局描述符表
4.3全局描述符表
81 0
|
NoSQL Redis
自定义全局自增ID生成器(下)
自定义全局自增ID生成器
203 0
|
算法 Java Spring
自定义全局自增ID生成器(上)
自定义全局自增ID生成器
179 0
|
缓存 NoSQL 算法
分布式全局唯一ID生成策略
“唯一ID”在应用程序中是一个很常见的需求,它用于唯一标识一个业务对象、一个资源、或者一个消息等等。在数据库中,唯一ID一般是用来做为一个数据的主键。看过前面介绍MySQL索引原理的文章的朋友应该知道,主键对于数据库的重要性不言而喻。 在单机场景下,要得到一个全局唯一的ID是非常容易的,你可以使用数据库的自增功能。
255 0