Golang一日一库之UUID
Golang 中生成唯一的字符串(UUID,GUID)
什么是UUID?
通用唯一标识符 (UUID) 是一种特定形式的标识符,在大多数实际用途中可以安全地认为是唯一的。两个正确生成的 UUID 相同的可能性几乎可以忽略不计,即使它们是由不同的各方在两个不同的环境中创建的。这就是为什么说 UUID 是普遍唯一的。
- UUID 是唯一的(出于实用目的):它重复的概率非常接近零。
- UUID 不依赖中央机构的注册和分配。
UUID 的字符串表示形式由 32 个十六进制数字组成,以 5 个组显示,由连字符 -
分隔。例如:
123e4567-e89b-12d3-a456-426655440000
UUID 的生成有两种
第一种是根据Rand 随机数 来生成UUID
第二种是直接调用UUID库
但其实 第二种的底层源码中 也是调用了Rand库来实现的 可以理解成不是单一的随机数封装
根据Rand 随机数 来生成UUID
// blog: https://www.cnblogs.com/zichliang package main import ( "crypto/rand" "fmt" "log" ) func getUUID() (uuid string) { b := make([]byte, 16) fmt.Println(b) _, err := rand.Read(b) if err != nil { log.Fatal(err) } uuid = fmt.Sprintf("%x-%x-%x-%x-%x", b[0:4], b[4:6], b[6:8], b[8:10], b[10:]) return } func main() { uuid := getUUID() fmt.Println(uuid) }
调用UUID 库
安装
go get -u github.com/satori/go.uuid
UUID 库基本上分为六种 分别是v1 v2,v3,v4,v5,v6
- uuid.NewV1
返回基于当前时间戳和MAC地址的UUID。
u1 := uuid.NewV1() fmt.Println("u1 >>>", u1)
- uuid.NewV2
返回基于POSIX UID/GID的DCE安全UUID。
u2 := uuid.NewV2(0) fmt.Println("u2 >>>", u2)
- uuid.NewV3
返回基于命名空间UUID和名称的MD5哈希的UUID。
u3 := uuid.NewV3(u2, "abc") fmt.Println("u3 >>>", u3)
- uuid.NewV4
返回随机生成的UUID。
u4 := uuid.NewV4() fmt.Println("u4 >>>", u4)
- uuid.NewV5
返回基于命名空间UUID和名称的SHA-1哈希的UUID。
u5 := uuid.NewV5(u2, "abc") fmt.Println("u5 >>>", u5)
- uuid.NewV6
本质上 没有差距 不过更新版本之前 某些方法 是有两个返回值的,Must是基于前者 进行的一个包装
u6 := uuid.Must(u5, nil) fmt.Println("u6 >>>", u6)
有时候我们需要把一个 uuid的字符串转成UUID可以用到以下方法
s := "6ba7b810-9dad-11d1-80b4-00c04fd430c8" uuidObject, err := uuid.FromString(s) if err != nil { log.Fatalf("failed to parse UUID %q: %v", s, err) } fmt.Println("successfully parsed UUID Version", uuidObject)
完整代码
点击展开
// blog: https://www.cnblogs.com/zichliang package main import ( "fmt" uuid "github.com/satori/go.uuid" ) func main() { //返回基于当前时间戳和MAC地址的UUID。 u1 := uuid.NewV1() fmt.Println("u1 >>>", u1) //返回基于POSIX UID/GID的DCE安全UUID。 u2 := uuid.NewV2(0) fmt.Println("u2 >>>", u2) //返回基于命名空间UUID和名称的MD5哈希的UUID。 u3 := uuid.NewV3(u2, "abc") fmt.Println("u3 >>>", u3) //返回随机生成的UUID。 u4 := uuid.NewV4() fmt.Println("u4 >>>", u4) //返回基于命名空间UUID和名称的SHA-1哈希的UUID。 u5 := uuid.NewV5(u2, "abc") fmt.Println("u5 >>>", u5) //本质上 没有差距 不过更新版本之前 某些方法 是有两个返回值的,Must是基于前者 进行的一个包装 u6 := uuid.Must(u5, nil) fmt.Println("u6 >>>", u6) //如果 u5 和 u6 相等,则返回true,否则返回false。 u7 := uuid.Equal(u5, u6) fmt.Println("u7 >>>", u7) // 将字符串转换成UUID s := "6ba7b810-9dad-11d1-80b4-00c04fd430c8" uuidObject, err := uuid.FromString(s) if err != nil { log.Fatalf("failed to parse UUID %q: %v", s, err) } fmt.Println("successfully parsed UUID Version", uuidObject) }
本文发表于博客园《始識的技术笔记》,作者为 zichliang(hybpjx/始識)
作者博客:https://www.cnblogs.com/zichliang
本文地址:https://www.cnblogs.com/zichliang/p/17297859.html
本文原创授权为:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
作者博客:https://www.cnblogs.com/zichliang
本文地址:https://www.cnblogs.com/zichliang/p/17297859.html
本文原创授权为:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!