欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-05 11:40:59
1、什么是uuiduuid简介通用唯一识别码(英语:universally unique identifier,简称uuid)是一种软件建构的标准,亦为*软件基金会组织在分散式计算环境领域的一部份。...

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

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