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各时间字符串使用解析
Apr 02 Golang
Golang 正则匹配效率详解
Apr 25 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
go设置多个GOPATH的方式
May 05 Golang
go语言中fallthrough的用法说明
May 06 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
Golang原生rpc(rpc服务端源码解读)
Apr 07 Golang
golang使用map实现去除重复数组
Apr 14 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
Golang解析JSON对象
Apr 30 Golang
Go语言入门exec的基本使用
May 20 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
php 删除记录实现代码
2009/03/12 PHP
解析PHP中如何将数组变量写入文件
2013/06/06 PHP
destoon整合UCenter图文教程
2014/06/21 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
express的中间件basicAuth详解
2014/12/04 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
jQuery中extend()和fn.extend()方法详解
2015/06/03 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
jQuery获取checkbox选中的值
2016/01/28 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
webpack入门必知必会
2017/01/16 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
详解在React-Native中持久化redux数据
2019/05/22 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
[02:28]DOTA2亚洲邀请赛 LGD战队巡礼
2015/02/03 DOTA
python中二维阵列的变换实例
2014/10/09 Python
python获取各操作系统硬件信息的方法
2015/06/03 Python
python实现二叉查找树实例代码
2018/02/08 Python
Python OpenCV中的resize()函数的使用
2019/06/20 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
python变量的存储原理详解
2019/07/10 Python
基于OpenCV的路面质量检测的实现
2020/11/04 Python
泰国王权免税店官方网站:KingPower
2019/03/11 全球购物
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
美国隐形眼镜网上商店:Lens.com
2019/09/03 全球购物
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
父亲八十大寿答谢词
2014/01/23 职场文书
文明市民先进事迹
2014/05/15 职场文书
公司法定代表人授权委托书
2014/09/29 职场文书
死亡诗社观后感
2015/06/05 职场文书
python中subplot大小的设置步骤
2021/06/28 Python