美文网首页
google/uuid

google/uuid

作者: JunChow520 | 来源:发表于2021-12-24 16:08 被阅读0次

    UUID全称Universally Unique IDentifier,由4个连字符-将一个32字节长(32个十六进制数组成)的字符串分割为5段,共计36字节长128位的字符串。

    例如:

    550e8400-e29b-41d4-a716-446655440000
    

    UUID的目的是让分布式系统中所有元素都具有唯一的辨识信息,而无需通过中心节点指定,同时无需考虑数据创建时的名称重复问题。目前最广泛使用的UUID是RFC4122协议。

    UUID实现中,GUID特指微软对标准UUID的实现。MySQL中可使用UUID()函数来生成,可使用CHAR(36)BINARY(36)来存储。

    > SELECT UUID();
    7c8a38b5-6490-11ec-9251-f43909452c6f
    

    为保证UUID的唯一性,RFC4122规范定义了包括网卡MAC地址、时间戳、命名空间、随机、伪随机、时序等元素,以及从这些元素中生成UUID的算法。UUID的复杂特性在保证其唯一性同时,意味着也只能通过计算机来生成。

    版本 描述
    v1 基于时间,通过当前时间戳、机器MAC地址生成,MAC全球唯一但会暴露存在风险。
    v2 DCE安全,和v1算法相同,但将时间戳前4位置换为POSIX的UID或GID。
    v3 基于命名空间,由用户指定一个命名空间和一个具体的字符串,通过MD5散列生成。
    v4 基于随机数,根据随机数或伪随机数生成。
    v5 基于名字空间,类似v3不过散列函数换成了SHA1。

    uuidgen

    Linux系统中可使用系统命令/usr/bin/uuidgen来生成UUID

    $ /usr/bin/uuid
    

    Golang可借助于exec.Command来执行uuidgen命令来生成

    package main
    
    import (
        "fmt"
        "log"
        "os/exec"
    )
    
    func main(){
        out,err := exec.Command("uuidgen").Output()
        if err!=nil {
            log.Fatal(err)
        }
        fmt.Printf("%s\n", out)
    }
    

    google/uuid

    google/uuid是Google开发的生成16字节UUID的Golang模块,实现了RFC4122,对UUID的v1、v2、v3、v4等版本都有实现。一般而言要生成唯一序列号的话,通常会使用v4版本。

    创建项目并初始化包

    $ mkdir test && cd test
    $ go mod init test
    

    下载并安装google/uuid到本地GOPATH目录下

    $ go get -u -v github.com/google/uuid
    

    创建入口文件并测试生成

    $ vim main.go
    
    package main
    
    import (
        "fmt"
        "github.com/google/uuid"
    )
    
    func main(){
        id := uuid.New()
        fmt.Printf("%s %s\n",  id, id.Version().String()) // 75381edd-ba50-4ae1-a480-2ef436457601 VERSION_4
        fmt.Printf("%s\n", uuid.New().String()) // c4aa07c3-8bcc-4ac1-9562-72e11bbfd7e8
    }
    

    相关文章

      网友评论

          本文标题:google/uuid

          本文链接:https://www.haomeiwen.com/subject/vcwlqrtx.html