一尘不染

有没有一种用go语言生成UUID的方法

go

我有看起来像这样的代码:

u := make([]byte, 16)
_, err := rand.Read(u)
if err != nil {
    return
}

u[8] = (u[8] | 0x80) & 0xBF // what does this do?
u[6] = (u[6] | 0x40) & 0x4F // what does this do?

return hex.EncodeToString(u)

它返回一个长度为32的字符串,但我认为它不是有效的UUID。如果它是一个真正的UUID,为什么它是一个UUID,什么是代码,修改的值的目的u[8]u[6]

有没有更好的方法来生成UUID?


阅读 269

收藏
2020-07-02

共1个答案

一尘不染

u[8] = (u[8] | 0x80) & 0xBF // what's the purpose ?
u[6] = (u[6] | 0x40) & 0x4F // what's the purpose ?

这些行将字节6和8的值限制在特定范围内。rand.Read返回range内的随机字节0-255,这些字节不是UUID的所有有效值。据我所知,这应该对片中的所有值进行。

如果您使用的是Linux,则可以调用/usr/bin/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", out)
}

产生:

$ go run uuid.go 
dc9076e9-2fda-4019-bd2c-900a8284b9c4
2020-07-02