GoLang中生成UUID唯一标识的实现
- 作者: 奥巴驴g
- 来源: 51数据库
- 2021-08-23
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)
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
推荐阅读
