ホームページ >バックエンド開発 >Golang >Go で UUID を生成する方法: `u[8] = (u[8] | 0x80) & 0xBF` および `u[6] = (u[6] | 0x40) & 0x4F` は何をしますか?

Go で UUID を生成する方法: `u[8] = (u[8] | 0x80) & 0xBF` および `u[6] = (u[6] | 0x40) & 0x4F` は何をしますか?

DDD
DDDオリジナル
2024-12-15 04:41:13222ブラウズ

How to Generate UUIDs in Go: What Do `u[8] = (u[8] | 0x80) & 0xBF` and `u[6] = (u[6] | 0x40) & 0x4F` Do?

Go での UUID 生成

UUID (Universally Unique Identifier) は、データ オブジェクトに一意の識別子を割り当てるために広く使用されています。 Go で UUID を生成するには、16 バイトの乱数の生成、UUID 仕様を満たすように結果の特定のビットを設定、結果を 16 進文字列としてエンコードするなど、いくつかの手順が必要です。

コードを詳しく見てみましょう。提供:

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)

あなたが提供したコードは、バージョン 4 の UUID を生成しようとしているようです。 u[8] = (u[8] | 0x80) & 0xBF 演算は、(0 ベースのインデックスの観点から) 9 バイト目の右から 4 番目のビットを 1 に設定しますが、u[6] = (u[6] | 0x40) & 0x4F 演算は、7 番目のバイトの右から 5 番目のビットを 1 に設定します。

これらの演算により、バイト 8 と6 は、UUID 仕様 (RFC 4122) で指定されているように、バージョン 4 UUID のバリアントおよびバージョン フィールドと一致します。

UUID を生成するより良い方法:

提供したコードは UUID の生成に使用できますが、これは推奨されるアプローチではありません。 Go でより堅牢かつ効率的な UUID 生成を行うには、Google の公式 UUID ライブラリ (https://github.com/google/uuid) を使用することをお勧めします。このライブラリを使用したコード サンプルは次のとおりです。

package main

import (
    "fmt"

    "github.com/google/uuid"
)

func main() {
    id := uuid.New()  // version 4 by default
    fmt.Println(id.String())
}

このアプローチは、UUID を生成するクリーンで標準化された方法を提供し、UUID 仕様への準拠を保証します。

以上がGo で UUID を生成する方法: `u[8] = (u[8] | 0x80) & 0xBF` および `u[6] = (u[6] | 0x40) & 0x4F` は何をしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。