我有如下代码:

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?

最佳答案

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

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

如果您使用的是 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

关于go - 有没有办法用go语言生成UUID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15130321/

10-13 06:36
查看更多