您的位置 首页 golang

golang – 生成UUID

UUID

UUID 是指Universally Unique Identifier,通用唯一识别码,UUID 的目的是让分布式系统中的所有元素都能有唯一的识别信息。

UUID 是由一组32位数的16进制数字所构成,是故 UUID 理论上的总数为1632=2128,约等于3.4 x 10123。

UUID的格式是十六个八位字节被表示为 32个十六进制数字,以连字号分隔的五组来显示,形式为 8-4-4-4-12,总共有 36个字符(即三十二个英数字母和四个连字号)

例如:

 xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx  

其中的M四位表示 UUID 版本 ,当前规范有5个版本,M可选值为1, 2, 3, 4, 5,这5个版本使用不同算法,利用不同的信息来产生UUID,各版本有各自优势,适用于不同情景。

 version 1, date-time & MAC address
version 2, date-time & group/user id
version 3, MD5 hash &  namespace 
version 4, pseudo-random number
version 5, SHA-1 hash & namespace  

N表示一至四个最高有效位表示 UUID 变体( variant ),有固定的两位10xx因此只可能取值8, 9, a, b。

UUID版本通过M表示,当前规范有5个版本,M可选值为1, 2, 3, 4, 5。

使用较多的是版本1和版本4,其中版本1使用当前时间戳和MAC地址信息。版本4使用(伪)随机数信息,128bit中,除去版本确定的4bit和variant确定的2bit,其它122bit全部由(伪)随机数信息确定。

由于时间戳和随机数的唯一性,版本1和版本4总是生成唯一的标识符。若希望对给定的一个 字符串 总是能生成相同的 UUID,使用版本3或版本5。

Go的UUID库

github上有很多UUID库,可以根据自己的实际需求,调研使用。这里使用这个进行测试。

 package main

import (
    "fmt"
    "log"

    "github.com/gofrs/uuid"
)

func main() {
    // 产生UUID1
    u1, err := uuid.NewV1()
    if err != nil {
        log.Fatalf("failed to generate Version 1 UUID: %v", err)
    }
    fmt.Println("generated Version 1 UUID:", u1.String())
    // 产生UUID2
    u2, err := uuid.NewV2('0')
    if err != nil {
        log.Fatalf("failed to generate Version 2 UUID: %v", err)
    }
    fmt.Println("generated Version 2 UUID:", u2.String())
    // 产生UUID3
    u3 := uuid.NewV3(uuid.Must(uuid.NewV1()), "opcai")
    if err != nil {
        log.Fatalf("failed to generate Version 3 UUID: %v", err)
    }
    fmt.Println("generated Version 3 UUID:", u3.String())
    // 产生UUID4
    u4, err := uuid.NewV4()
    if err != nil {
        log.Fatalf("failed to generate Version 4  UUID: %v", err)
    }
    fmt.Println("generated Version 4 UUID:", u4.String())
    // 产生UUID5
    u5 := uuid.NewV5(uuid.Must(uuid.NewV4()), "opcai")
    if err != nil {
        log.Fatalf("failed to generate Version 5  UUID: %v", err)
    }
    fmt.Println("generated Version 5 UUID:", u5.String())

    // 将字符串转换成UUID
    s := "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
    uuidObject, err := uuid.FromString(s)
    if err != nil {
        log.Fatalf("failed to parse UUID %q: %v", s, err)
    }
    fmt.Println("successfully parsed UUID Version", uuidObject.Version())
}
  

文章来源:智云一二三科技

文章标题:golang – 生成UUID

文章地址:https://www.zhihuclub.com/96711.shtml

关于作者: 智云科技

热门文章

网站地图