我的代码如下所示:

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的有效值.不过,据我所知,应该对切片中的所有值执行此操作.

如果您使用的是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相关问答推荐

如何在Deliverq中高效地传达客户依赖关系?

Go汇编器命名为Constants

Go程序在并发Forking 循环中停留在syscall.Wait4

理解Golang并发:缓冲通道的意外行为

是不是有什么原因导致`Strings.EqualFold`不先进行长度比较?

通过渠道和goroutines增值1000倍

我可以在Golang中的另一个类型参数的基础上约束一个类型的参数吗?

Json.Unmarshal() 和 gin.BindJson() 之间的区别

io.Reader 无限循环与 fmt.Fscan

我无法使用反向代理更改主机标头

最长连续重复的字符golang

当填充通道的函数调用未嵌入 goroutine 时,为什么我会遇到死锁?

你如何在 Golang 代码中测试 filepath.Abs​​ 失败?

使用 ssh 从私有 gilab 仓库导入一个 go 项目:未知修订

整理时转换值

Wire google Inject with multi return from provider 函数

未定义 protoc protoc-gen-go 时间戳

使用无服务器工作流 go sdk 时出现间歇性 JSON 解组错误

Go 使用 struct 作为接口而不实现所有方法

如何在 Prometheus 中正确检测区域和环境信息?