GoLang中生成UUID唯一标识的实现


Posted in Golang onMay 08, 2021

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)
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
用golang如何替换某个文件中的字符串
Apr 25 Golang
golang http使用踩过的坑与填坑指南
Apr 27 Golang
golang goroutine顺序输出方式
Apr 29 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
golang 实现时间戳和时间的转化
May 07 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
Go 中的空白标识符下划线
Mar 25 Golang
Go归并排序算法的实现方法
Apr 06 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Go 内联优化让程序员爱不释手
Jun 21 Golang
聊聊golang中多个defer的执行顺序
May 08 #Golang
Golang全局变量加锁的问题解决
golang 实现并发求和
May 08 #Golang
golang中的并发和并行
May 08 #Golang
关于golang高并发的实现与注意事项说明
May 08 #Golang
基于Golang 高并发问题的解决方案
May 08 #Golang
使用golang编写一个并发工作队列
May 08 #Golang
You might like
WordPress中is_singular()函数简介
2015/02/05 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
TNC vs IO BO3 第二场2.13
2021/03/10 DOTA
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
JavaScript之AOP编程实例
2015/07/17 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
浅谈webpack4.x 入门(一篇足矣)
2018/09/05 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
Python isinstance函数介绍
2015/04/14 Python
python3.x上post发送json数据
2018/03/04 Python
python微信公众号开发简单流程
2018/03/23 Python
对python3 urllib包与http包的使用详解
2018/05/10 Python
浅谈python之新式类
2018/08/12 Python
python画一个玫瑰和一个爱心
2020/08/18 Python
详解python中eval函数的作用
2019/10/22 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
关于赌博的检讨书
2014/01/08 职场文书
自动化毕业生专业自荐书范文
2014/02/04 职场文书
大学军训感言300字
2014/03/09 职场文书
婚礼主持词
2014/03/13 职场文书
2014年关于两会精神的心得体会
2014/03/17 职场文书
贷款委托书范本
2014/04/08 职场文书
2015年教学工作总结
2015/04/02 职场文书
2015年药店工作总结
2015/04/20 职场文书
河童之夏观后感
2015/06/11 职场文书
财务人员入职担保书
2015/09/22 职场文书
简单谈谈Python面向对象的相关知识
2021/06/28 Python
python如何为list实现find方法
2022/05/30 Python