1. ホーム
  2. go

[解決済み] go言語でUUIDを生成する方法はありますか?

2022-03-06 09:25:01

質問

次のようなコードがあります。

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