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

使用:

package mainimport ("fmt""github.com/satori/go.uuid"
)func main() {id := uuid.NewV4()ids := id.String()
}

3、自定义的 UUIDGenerator实现

功能:

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

代码

package utilsimport "fmt"const (MAXUINT32 = 4294967295DEFAULT_UUID_CNT_CACHE = 512
)type UUIDGenerator struct {Prefix       stringidGen        uint32internalChan chan uint32
}func NewUUIDGenerator(prefix string) *UUIDGenerator {gen := &UUIDGenerator{Prefix:       prefix,idGen:        0,internalChan: make(chan uint32, DEFAULT_UUID_CNT_CACHE),}gen.startGen()return gen
}//开启 goroutine, 把生成的数字形式的UUID放入缓冲管道
func (this *UUIDGenerator) startGen() {go func() {for {if this.idGen == MAXUINT32 {this.idGen = 1} else {this.idGen += 1}this.internalChan <- this.idGen}}()
}//获取带前缀的字符串形式的UUID
func (this *UUIDGenerator) Get() string {idgen := <-this.internalChanreturn fmt.Sprintf("%s%d", this.Prefix, idgen)
}//获取uint32形式的UUID
func (this *UUIDGenerator) GetUint32() uint32 {return <-this.internalChan
}

测试用例:

package utilsimport ("testing""fmt"
)func TestUUIDGenerator(t *testing.T) {//新建UUIDGenneratorUUIDFactory := NewUUIDGenerator("idtest")//获取UUIDfor i:= 0; i < 50; i++{fmt.Println(UUIDFactory.Get())}//获取uint32 形式的UUIDfor i := 0; i < 50; i++{fmt.Println(UUIDFactory.GetUint32())}
}

结果

idtest1
idtest2
idtest3
idtest4
idtest5
6
7
8
9
10
PASS