0
点赞
收藏
分享

微信扫一扫

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

左小米z 2022-11-17 阅读 156


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实现

功能:

  1. UUIDGenerator 可以生成全局唯一的字符串形式的ID,ID由两部分构成,一部分是用户指定的前缀,另一部分是数字,数字的最大值为 4294967295;
  2. 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

 

举报

相关推荐

0 条评论