有没有用Go语言生成UUID的方法?

新手上路,请多包涵

我有这样的代码:

 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 的方法?

原文由 hardPass 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 824
2 个回答
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

原文由 jimt 发布,翻译遵循 CC BY-SA 3.0 许可协议

谷歌官方有一个实现: https ://github.com/google/uuid

生成版本 4 UUID 的工作方式如下:

 package main

import (
    "fmt"
    "github.com/google/uuid"
)

func main() {
    id := uuid.New()
    fmt.Println(id.String())
}

在这里试试:https: //play.golang.org/p/6YPi1djUMj9

原文由 shutefan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏