Golang常用库之UUID
Contents
1. 什么是UUID?
通用唯一标识符 (UUID) 是一种特定形式的标识符,在大多数实际用途中可以安全地认为是唯一的。两个正确生成的 UUID 相同的可能性几乎可以忽略不计,即使它们是由不同的各方在两个不同的环境中创建的。这就是为什么说 UUID 是普遍唯一的。
- UUID 是唯一的(出于实用目的):它重复的概率非常接近零。
- UUID 不依赖中央机构的注册和分配。
UUID 的字符串表示形式由 32 个十六进制数字组成,以 5 个组显示,由连字符 - 分隔。例如:123e4567-e89b-12d3-a456-426655440000
UUID 的生成有两种
- 第一种是根据Rand 随机数 来生成UUID
- 第二种是直接调用UUID库
但其实 第二种的底层源码中 也是调用了Rand库来实现的 可以理解成不是单一的随机数封装
2. 根据Rand 随机数 来生成UUID
1// blog: https://www.cnblogs.com/zichliang
2package main
3
4import (
5 "crypto/rand"
6 "fmt"
7 "log"
8)
9
10func getUUID() (uuid string) {
11 b := make([]byte, 16)
12 fmt.Println(b)
13 _, err := rand.Read(b)
14 if err != nil {
15 log.Fatal(err)
16 }
17 uuid = fmt.Sprintf("%x-%x-%x-%x-%x",
18 b[0:4], b[4:6], b[6:8], b[8:10], b[10:])
19 return
20}
21
22func main() {
23 uuid := getUUID()
24 fmt.Println(uuid)
25}
3. 调用UUID 库
安装UUID库
1go get -u github.com/satori/go.uuid
3.1. UUID 库基本上分为六种 分别是v1 v2,v3,v4,v5,v6
3.1.1. uuid.NewV1
返回基于当前时间戳和MAC地址的UUID。
1u1 := uuid.NewV1()
2fmt.Println("u1 >>>", u1)
3.1.2. uuid.NewV2
返回基于POSIX UID/GID的DCE安全UUID。
1u2 := uuid.NewV2(0)
2fmt.Println("u2 >>>", u2)
3.1.3. uuid.NewV3
返回基于命名空间UUID和名称的MD5哈希的UUID。
1u3 := uuid.NewV3(u2, "abc")
2fmt.Println("u3 >>>", u3)
3.1.4. uuid.NewV4
返回随机生成的UUID。
1u4 := uuid.NewV4()
2fmt.Println("u4 >>>", u4)
3.1.5. uuid.NewV5
返回基于命名空间UUID和名称的SHA-1哈希的UUID。
1u5 := uuid.NewV5(u2, "abc")
2fmt.Println("u5 >>>", u5)
3.1.6. uuid.NewV6
本质上 没有差距 不过更新版本之前 某些方法 是有两个返回值的,Must是基于前者 进行的一个包装
1u6 := uuid.Must(u5, nil)
2fmt.Println("u6 >>>", u6)
有时候我们需要把一个 uuid的字符串转成UUID可以用到以下方法
1s := "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
2uuidObject, err := uuid.FromString(s)
3if err != nil {
4 log.Fatalf("failed to parse UUID %q: %v", s, err)
5}
6fmt.Println("successfully parsed UUID Version", uuidObject)
4. 完整代码
1// blog: https://www.cnblogs.com/zichliang
2package main
3
4import (
5 "fmt"
6 uuid "github.com/satori/go.uuid"
7)
8
9func main() {
10
11 //返回基于当前时间戳和MAC地址的UUID。
12 u1 := uuid.NewV1()
13 fmt.Println("u1 >>>", u1)
14
15 //返回基于POSIX UID/GID的DCE安全UUID。
16 u2 := uuid.NewV2(0)
17 fmt.Println("u2 >>>", u2)
18
19 //返回基于命名空间UUID和名称的MD5哈希的UUID。
20 u3 := uuid.NewV3(u2, "abc")
21 fmt.Println("u3 >>>", u3)
22
23 //返回随机生成的UUID。
24 u4 := uuid.NewV4()
25 fmt.Println("u4 >>>", u4)
26
27 //返回基于命名空间UUID和名称的SHA-1哈希的UUID。
28 u5 := uuid.NewV5(u2, "abc")
29 fmt.Println("u5 >>>", u5)
30
31 //本质上 没有差距 不过更新版本之前 某些方法 是有两个返回值的,Must是基于前者 进行的一个包装
32 u6 := uuid.Must(u5, nil)
33 fmt.Println("u6 >>>", u6)
34
35 //如果 u5 和 u6 相等,则返回true,否则返回false。
36 u7 := uuid.Equal(u5, u6)
37 fmt.Println("u7 >>>", u7)
38
39 // 将字符串转换成UUID
40 s := "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
41 uuidObject, err := uuid.FromString(s)
42 if err != nil {
43 log.Fatalf("failed to parse UUID %q: %v", s, err)
44 }
45 fmt.Println("successfully parsed UUID Version", uuidObject)
46}