我有如下代码:
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
您可以使用go-uuid库生成 UUID 。这可以安装:
go get github.com/nu7hatch/gouuid
您可以使用以下命令生成随机(版本 4)UUID:
import "github.com/nu7hatch/gouuid" ... u, err := uuid.NewV4()
返回的UUID类型是一个 16 字节的数组,因此您可以轻松检索二进制值。它还通过其String()方法提供标准的十六进制字符串表示。
UUID
String()
您拥有的代码看起来也将生成一个有效的版本 4 UUID:您在最后执行的按位操作设置 UUID 的版本和变体字段以将其正确标识为版本 4。这样做是为了将随机 UUID 与通过其他算法生成的 UUID(例如,基于您的 MAC 地址和时间的版本 1 UUID)区分开来。