GoLang中生成UUID唯一标识的实现
程序员文章站
2022-04-05 11:40:59
1、什么是uuiduuid简介通用唯一识别码(英语:universally unique identifier,简称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
使用:
package main import ( "fmt" "github.com/satori/go.uuid" ) func main() { id := uuid.newv4() ids := id.string() }
3、自定义的 uuidgenerator实现
功能:
uuidgenerator 可以生成全局唯一的字符串形式的id,id由两部分构成,一部分是用户指定的前缀,另一部分是数字,数字的最大值为 4294967295;
uuidgenerator 可以生成全局唯一的无符号整形数字,数字范围 0- 4294967295
代码
package utils import "fmt" const ( maxuint32 = 4294967295 default_uuid_cnt_cache = 512 ) type uuidgenerator struct { prefix string idgen uint32 internalchan 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.internalchan return fmt.sprintf("%s%d", this.prefix, idgen) } //获取uint32形式的uuid func (this *uuidgenerator) getuint32() uint32 { return <-this.internalchan }
测试用例:
package utils import ( "testing" "fmt" ) func testuuidgenerator(t *testing.t) { //新建uuidgennerator uuidfactory := newuuidgenerator("idtest") //获取uuid for i:= 0; i < 50; i++{ fmt.println(uuidfactory.get()) } //获取uint32 形式的uuid for i := 0; i < 50; i++{ fmt.println(uuidfactory.getuint32()) } }
结果
idtest1
idtest2
idtest3
idtest4
idtest5
6
7
8
9
10
pass
补充:golang 的 uuid 使用
安装
go get github.com/satori/go.uuid
使用
几种 uuid 的产生方式:
version 1, based on timestamp and mac address (rfc 4122) version 2, based on timestamp, mac address and posix uid/gid (dce 1.1) version 3, based on md5 hashing (rfc 4122) version 4, based on random numbers (rfc 4122) version 5, based on sha-1 hashing (rfc 4122)
示例代码:
package main import ( "fmt" "github.com/satori/go.uuid" ) func main() { // creating uuid version 4 // panic on error u1 := uuid.must(uuid.newv4()) fmt.printf("uuidv4: %s\n", u1) // or error handling u2, err := uuid.newv4() if err != nil { fmt.printf("something went wrong: %s", err) return } fmt.printf("uuidv4: %s\n", u2) // parsing uuid from string input u2, err := uuid.fromstring("6ba7b810-9dad-11d1-80b4-00c04fd430c8") if err != nil { fmt.printf("something went wrong: %s", err) } fmt.printf("successfully parsed: %s", u2) }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
上一篇: 爆囧,笑的你超无语...
下一篇: Redis实现订单自动过期功能的示例代码