我有看起来像这样的代码:
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]。
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返回range内的随机字节0-255,这些字节不是UUID的所有有效值。据我所知,这应该对片中的所有值进行。
rand.Read
0-255
如果您使用的是Linux,则可以调用/usr/bin/uuidgen。
/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