我有如下代码:
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/