当前位置:   article > 正文

Golang常用库之UUID

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

  1. // blog: https://www.cnblogs.com/zichliang
  2. package main
  3. import (
  4. "crypto/rand"
  5. "fmt"
  6. "log"
  7. )
  8. func getUUID() (uuid string) {
  9. b := make([]byte, 16)
  10. fmt.Println(b)
  11. _, err := rand.Read(b)
  12. if err != nil {
  13. log.Fatal(err)
  14. }
  15. uuid = fmt.Sprintf("%x-%x-%x-%x-%x",
  16. b[0:4], b[4:6], b[6:8], b[8:10], b[10:])
  17. return
  18. }
  19. func main() {
  20. uuid := getUUID()
  21. fmt.Println(uuid)
  22. }

调用UUID 库

安装

go get -u github.com/satori/go.uuid

UUID 库基本上分为六种 分别是v1 v2,v3,v4,v5,v6

  1. uuid.NewV1
    返回基于当前时间戳和MAC地址的UUID。
  1. u1 := uuid.NewV1()
  2. fmt.Println("u1 >>>", u1)
  1. uuid.NewV2
    返回基于POSIX UID/GID的DCE安全UUID。
  1. u2 := uuid.NewV2(0)
  2. fmt.Println("u2 >>>", u2)
  1. uuid.NewV3
    返回基于命名空间UUID和名称的MD5哈希的UUID。
  1. u3 := uuid.NewV3(u2, "abc")
  2. fmt.Println("u3 >>>", u3)
  1. uuid.NewV4
    返回随机生成的UUID。
  1. u4 := uuid.NewV4()
  2. fmt.Println("u4 >>>", u4)
  1. uuid.NewV5
    返回基于命名空间UUID和名称的SHA-1哈希的UUID。
  1. u5 := uuid.NewV5(u2, "abc")
  2. fmt.Println("u5 >>>", u5)
  1. uuid.NewV6
    本质上 没有差距 不过更新版本之前 某些方法 是有两个返回值的,Must是基于前者 进行的一个包装
  1. u6 := uuid.Must(u5, nil)
  2. fmt.Println("u6 >>>", u6)

有时候我们需要把一个 uuid的字符串转成UUID可以用到以下方法

  1. s := "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
  2. uuidObject, err := uuid.FromString(s)
  3. if err != nil {
  4. log.Fatalf("failed to parse UUID %q: %v", s, err)
  5. }
  6. fmt.Println("successfully parsed UUID Version", uuidObject)

完整代码

  1. // blog: https://www.cnblogs.com/zichliang
  2. package main
  3. import (
  4. "fmt"
  5. uuid "github.com/satori/go.uuid"
  6. )
  7. func main() {
  8. //返回基于当前时间戳和MAC地址的UUID。
  9. u1 := uuid.NewV1()
  10. fmt.Println("u1 >>>", u1)
  11. //返回基于POSIX UID/GID的DCE安全UUID。
  12. u2 := uuid.NewV2(0)
  13. fmt.Println("u2 >>>", u2)
  14. //返回基于命名空间UUID和名称的MD5哈希的UUID。
  15. u3 := uuid.NewV3(u2, "abc")
  16. fmt.Println("u3 >>>", u3)
  17. //返回随机生成的UUID。
  18. u4 := uuid.NewV4()
  19. fmt.Println("u4 >>>", u4)
  20. //返回基于命名空间UUID和名称的SHA-1哈希的UUID。
  21. u5 := uuid.NewV5(u2, "abc")
  22. fmt.Println("u5 >>>", u5)
  23. //本质上 没有差距 不过更新版本之前 某些方法 是有两个返回值的,Must是基于前者 进行的一个包装
  24. u6 := uuid.Must(u5, nil)
  25. fmt.Println("u6 >>>", u6)
  26. //如果 u5 和 u6 相等,则返回true,否则返回false。
  27. u7 := uuid.Equal(u5, u6)
  28. fmt.Println("u7 >>>", u7)
  29. // 将字符串转换成UUID
  30. s := "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
  31. uuidObject, err := uuid.FromString(s)
  32. if err != nil {
  33. log.Fatalf("failed to parse UUID %q: %v", s, err)
  34. }
  35. fmt.Println("successfully parsed UUID Version", uuidObject)
  36. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/850878
推荐阅读
相关标签
  

闽ICP备14008679号