🪪

UUIDがGoの標準ライブラリになるまで

に公開

はじめに

こんにちは、Lapi(@dragoneena12)です。

2026年4月8日、Goの標準ライブラリにUUIDを追加するプロポーザルがAcceptされました。めでたい🎉
早速Go1.27で追加される予定みたいです

個人的に追加に至るまでの経緯が気になったのでこの記事を書いてみました。
基本的な経緯としてはDamien Neil氏の投稿にほとんどまとまっているのでこちらをベースにしつつ、少し深掘りする形で作成しています。

最初の提案

https://github.com/golang/go/issues/23789

最初に標準ライブラリとしてUUIDを追加する提案が出されたのは2018年のこちらの提案でした。しかしこの際は標準ライブラリとして必要とされる情報が十分に足りていないという理由で凍結されました。

そもそもGoの標準ライブラリとして採用されるには高いハードルがあり、それはGoのFAQページでも言及されています。その理由として、標準ライブラリに含まれるコードは継続的なメンテナンスに多大なコストがかかること、Go1互換性の制約対象となり破壊的な変更を行えないこと、Goのリリーススケジュールに束縛されバグ修正が遅くなることが挙げられています。

現在最もよく使われているgithub.com/google/uuidのv1がリリースされたのは2018年8月28日であり、この提案がなされるよりも後のことでした。crypto/randパッケージに対してUUID関数を追加するなどの提案もされましたが、それで十分かどうか判断するための十分な情報がないためこちらの提案も取り下げられました。

今回の提案

https://github.com/golang/go/issues/62026

今回Acceptされたのは2023年のこちらの提案です。github.com/google/uuidがリリースされてから約5年の月日が経ち、ほとんどのGoプログラムで採用されていることと、そのインターフェースが安定していること。またC#、Java、JavaScript、Python、Rubyといった他の言語でもUUIDは標準ライブラリとしてサポートされていることが再度提案した理由として挙げられました。

他にも標準ライブラリ化する理由としてパッケージ間の互換性が挙げられています。これまでgithub.com/google/uuidのほかにもgithub.com/satori/go.uuidなどの様々なUUIDライブラリが存在していました。このため別のUUIDライブラリを採用しているパッケージ間で値を受け渡す際にキャストが必要であったり、扱いが異なったりという問題がありました。標準ライブラリ化によってこれらを統一的に扱えるようになります(xkcd:927のような問題が起きうることも反論としてあります)

また最初の提案の時点ではどのような標準UUIDライブラリがどのようなインターフェースをサポートするかについての合意が得られませんでしたが、github.com/google/uuidの普及によりどの関数が多く利用されているかについての資料が集まったことも採用の理由として挙げられています。

パッケージ名

パッケージ名としては uuid が採用されました。
crypto/uuid などのパッケージ名も提案されましたが、UUIDのRFC内においてcryptoという用語が4回しか登場せず、そのすべてが「十分に安全なランダム入力ソースを使うべき」という推奨に関する言及であり、UUIDの定義においてそれ以外に暗号学的要素が含まれないことから、短い名前にしておく方が良いという判断になりました。

生成関数

func New() UUID
func NewV4() UUID
func NewV7() UUID

UUIDを生成する関数としては上記のようにNewNewV4NewV7の3つが採用されました。

github.com/google/uuid パッケージの利用状況を分析したところ、約94%のユーザーがUUIDv4を生成し、4%がUUIDv1を、1%がUUIDv7を生成していました。UUIDv1は現時点でほぼ廃れておりRFC9562はUUIDv1ではなくUUIDv7を選ぶように推奨しています。UUIDv7は現時点ではあまり広く使われていないが、このバージョンが標準化されたのは2024年のことであり、またB-tree構造のデータベースで性能上の優位性があり今後第一の選択肢となる可能性が高いです。以上からUUIDv4とUUIDv7を採用するという判断になりました。

また、デフォルトのNew関数で生成されるUUIDのアルゴリズムとしてはUUIDv4が選ばれています。B-tree構造のデータベースなどシナリオによってはUUIDv7には性能上の利点がありますが、BigtableやCassandraのような水平シャーディングされたデータベースに大量のエントリを挿入する場合、ホットスポッティングや性能ボトルネックを引き起こす可能性があります。UUIDv7にはタイムスタンプが含まれるためこれがセキュリティ上の問題となる可能性もあります。対してUUIDv4は単なる大きな乱数に過ぎないため最も安全なデフォルトであると判断されました。

まとめ

今回はGoに新たに導入される予定のUUIDパッケージの導入までの経緯について簡単に調べてみました。
UUIDについてはユースケースがとても多いので、多くの人が利便性を享受できるアップデートになるのではないかなと思います。僕も仕事でも個人開発でもよく使うライブラリなので、Go1.27のリリースを楽しみにしています。

今回紹介したissueには記事にした内容以外にも興味深い議論がたくさんあるので、興味のある人はぜひ覗いてみてください。

参考文献

https://github.com/golang/go/issues/23789
https://github.com/golang/go/issues/62026
https://go.dev/doc/faq#x_in_std

GitHubで編集を提案
TOKIUMプロダクトチーム テックブログ

Discussion