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 Gin实现文件上传下载的示例代码
Apr 02 Golang
一文读懂go中semaphore(信号量)源码
Apr 03 Golang
golang interface判断为空nil的实现代码
Apr 24 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
Go语言实现Snowflake雪花算法
Jun 08 Golang
golang中的struct操作
Nov 11 Golang
Golang数据类型和相互转换
Apr 12 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
Golang 链表的学习和使用
Apr 19 Golang
Golang bufio详细讲解
Apr 21 Golang
Golang 并发编程 SingleFlight模式
Apr 26 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 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
ThinkPHP控制器详解
2015/07/27 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
javascript基本语法分析说明
2008/06/15 Javascript
jQuery Flash/MP3/Video多媒体插件
2010/01/18 Javascript
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
JavaScript prototype属性深入介绍
2012/11/27 Javascript
Javascript实现滑块滑动改变值的实现代码
2013/04/12 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
推荐10个2014年最佳的jQuery视频插件
2014/11/12 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
基于node.js依赖express解析post请求四种数据格式
2017/02/13 Javascript
jQuery中.attr()和.data()的区别分析
2017/09/03 jQuery
基于Vue制作组织架构树组件
2017/12/06 Javascript
python实现的防DDoS脚本
2011/02/08 Python
python3使用tkinter实现ui界面简单实例
2014/01/10 Python
Python实例分享:快速查找出被挂马的文件
2014/06/08 Python
浅谈Python中的私有变量
2018/02/28 Python
python爬取网易云音乐评论
2018/11/16 Python
Python assert语句的简单使用示例
2019/07/28 Python
Python @property装饰器原理解析
2020/01/22 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
通过实例解析Python文件操作实现步骤
2020/09/21 Python
运动服饰每月订阅盒:Ellie
2018/04/29 全球购物
HOTEL INFO英国:搜索全球酒店
2019/08/08 全球购物
介绍一下Linux中的链接
2016/06/05 面试题
入党申请自荐书范文
2014/02/11 职场文书
实习生矿工检讨书
2014/10/13 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
2015重阳节座谈会主持词
2015/07/30 职场文书
初中班干部工作总结
2015/08/10 职场文书
《秋思》教学反思
2016/02/23 职场文书
python中的getter与setter你了解吗
2022/03/24 Python