当前位置:   article > 正文

GoLang中生成UUID唯一标识的方法_golang uuid

golang uuid

1、什么是UUID

UUID简介
通用唯一识别码(英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准,亦为自由软件基金会组织在分散式计算环境领域的一部份。
UUID的目的,是让分散式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。目前最广泛应用的UUID,是微软公司的全局唯一标识符(GUID),而其他重要的应用,则有Linux ext2/ext3文件系统、LUKS加密分区、GNOME、KDE、Mac OS X等等。

2、Go中现有的UUID第三方生成办法

目前,golang中的uuid还没有纳入标准库,我们使用github上的开源库:

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

使用:

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/satori/go.uuid"
  5. )
  6. func main() {
  7. id := uuid.NewV4()
  8. ids := id.String()
  9. }

3、自定义的 UUIDGenerator实现

功能:

  1. UUIDGenerator 可以生成全局唯一的字符串形式的ID,ID由两部分构成,一部分是用户指定的前缀,另一部分是数字,数字的最大值为 4294967295;
  2. UUIDGenerator 可以生成全局唯一的无符号整形数字,数字范围 0- 4294967295

代码

  1. package utils
  2. import "fmt"
  3. const (
  4. MAXUINT32 = 4294967295
  5. DEFAULT_UUID_CNT_CACHE = 512
  6. )
  7. type UUIDGenerator struct {
  8. Prefix string
  9. idGen uint32
  10. internalChan chan uint32
  11. }
  12. func NewUUIDGenerator(prefix string) *UUIDGenerator {
  13. gen := &UUIDGenerator{
  14. Prefix: prefix,
  15. idGen: 0,
  16. internalChan: make(chan uint32, DEFAULT_UUID_CNT_CACHE),
  17. }
  18. gen.startGen()
  19. return gen
  20. }
  21. //开启 goroutine, 把生成的数字形式的UUID放入缓冲管道
  22. func (this *UUIDGenerator) startGen() {
  23. go func() {
  24. for {
  25. if this.idGen == MAXUINT32 {
  26. this.idGen = 1
  27. } else {
  28. this.idGen += 1
  29. }
  30. this.internalChan <- this.idGen
  31. }
  32. }()
  33. }
  34. //获取带前缀的字符串形式的UUID
  35. func (this *UUIDGenerator) Get() string {
  36. idgen := <-this.internalChan
  37. return fmt.Sprintf("%s%d", this.Prefix, idgen)
  38. }
  39. //获取uint32形式的UUID
  40. func (this *UUIDGenerator) GetUint32() uint32 {
  41. return <-this.internalChan
  42. }

测试用例:

  1. package utils
  2. import (
  3. "testing"
  4. "fmt"
  5. )
  6. func TestUUIDGenerator(t *testing.T) {
  7. //新建UUIDGennerator
  8. UUIDFactory := NewUUIDGenerator("idtest")
  9. //获取UUID
  10. for i:= 0; i < 50; i++{
  11. fmt.Println(UUIDFactory.Get())
  12. }
  13. //获取uint32 形式的UUID
  14. for i := 0; i < 50; i++{
  15. fmt.Println(UUIDFactory.GetUint32())
  16. }
  17. }

结果

  1. idtest1
  2. idtest2
  3. idtest3
  4. idtest4
  5. idtest5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. PASS

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/850887
推荐阅读
相关标签
  

闽ICP备14008679号