- Go言語にUUIDの生成およびパース機能を標準ライブラリに含めるという提案がGitHubで議論された
- 提案者は、現在ほとんどのGoサーバー・DBプロジェクトがgithub.com/google/uuidのような外部パッケージに依存していることを根拠として示した
- C#、Java、Pythonなどの主要言語では、すでに標準ライブラリレベルでUUIDサポートが提供されている
- 議論の過程では、UUIDv7などの最新仕様とRFC 9562準拠の可否、パース機能の含有範囲、APIの一貫性などが主要な論点として扱われた
- この提案はその後、**crypto/randパッケージへのUUIDv4・UUIDv7サポート追加提案(#76319)**に統合されて進行中である
提案概要
- Go標準ライブラリにUUID生成およびパースAPIを追加する案を提示
- 対象バージョンはUUID v3、v4、v5
- 主な根拠は、外部パッケージへの依存度と他言語における標準サポートの事例
- UUIDはRFC 4122(のちにRFC 9562)で定義された国際標準である
- 提案者は、Goが主要言語の中でUUIDの標準サポートがない例外的なケースだと指摘した
初期反応と議論
- 一部の参加者は、過去にも類似提案があったが却下された前例に言及した(#23789、#28324)
- 理由は、外部パッケージの利用が十分に簡単であり、標準ライブラリよりもリリースサイクルが柔軟である点
- 提案者は「ほとんどのプロジェクトが毎回外部パッケージをインポートしなければならないなら、いっそ標準に含める方がよい」と主張
- 多くの言語がUUIDをcrypto関連の標準ライブラリに含めている点が支持根拠として示された
最新UUIDバージョンとRFC反映
- 一部の意見では、UUID v1〜v5は古く、v7が最新かつ有望なバージョンだと指摘された
- v7にはさまざまな実装オプションがあり、適用結果を見守る必要がある
- RFC草案では、UUIDを不必要にパースせず不透明な識別子として扱うことが推奨された
- その後RFC 9562が正式発行され、関連議論はUUIDv7サポート中心へと移行した
提案の修正と統合
- 2025年、RFC 9562が正式化されると、PostgreSQL 18がUUIDv7をサポートしたことへの言及があった
- その後Go側では、crypto/randパッケージにUUIDv4・UUIDv7生成機能のみを追加する別提案(#76319)を開始
- 元の提案(#62026)は**重複(duplicate)**として処理されてクローズされた
API設計の議論
uuid.New()のデフォルト動作をv4にするか、将来変更の余地を残すかが議論された
- 一部は「バージョン変更時に互換性問題が生じうる」として、常にv4に固定すべきだと提案
Compare、MustParse、Parseなどのメソッドを提供するかどうかも議論された
CompareはRFC定義に従い、ソート可能なUUIDサポートのために必要だという意見
MustParseは標準内の他のMust*関数との一貫性を保つために含めるという意見
IsZero()メソッドはUUID型には不要という結論になった
Generator構造体の導入、バージョン別型の分離(UUIDv4、UUIDv7など)など、さまざまな設計案が提示された
- 一部では
New()関数の曖昧さを指摘し、**明示的なバージョン関数(NewV4、NewV7)**のみを提供すべきだという意見も示された
主な技術的論点
- UUIDのソート定義がv6・v7にのみ明確に存在するのかどうかが議論された
- UUIDv7生成時の時間ベース順序保証および**並行実行時の衝突防止(counter方式)**の実装方法が検討された
- バージョンごとの意味の違い(例: v1はMACアドレスを含み、v7は時間ベース)により、単一型設計の限界が指摘された
- 一部ではバージョン別型の分離と明示的な変換メソッド(
AsV4(), AsV7()など)の導入が提案された
結論と現状
- Goコミュニティは、UUID標準サポートの必要性には概ね同意している
- ただし、標準ライブラリの単純性維持とRFC勧告の順守のため、
- パース機能は除外
- UUIDv4・UUIDv7生成機能のみをcrypto/randに追加する方向で整理された
- 元の提案(#62026)は**#76319提案に統合されて進行中であり、
Go言語のUUID標準サポートが正式化段階に近づいている**状態である
1件のコメント
Hacker Newsの意見
UUID バージョン 1〜5 がすでに時代遅れだという話は興味深かった
ただし v4 は依然として最もランダム性が高く、分散 DB で ホットスポット問題とプライバシーの問題 を避けるために主キーとして推奨されている
参考リンク: CockroachDB UUID ドキュメント, Google Cloud Spanner UUID ガイド
各 UUID バージョン(v4 を含む)は特定の状況では欠点がある。実際、多くの組織は標準 UUID の代わりに 純粋な 128 ビット値 を独自定義して使っている
結局のところ、UUID の設計上の限界を超える複雑な要件が増えてきた
今日 HN にこういう ちょっとした Go 関連ニュース が上がっていたのはうれしい
最近はプログラミングの未来や AI の話ばかりなので、こういう技術トピックは新鮮だ
完璧主義者、実務開発者、そして crypto コミュニティ がそれぞれ異なる立場を取っている
関連文書: RFC 9562
Go が正しい決定をしてくれることを願っている。特に TinyGo はマイクロコントローラ向けとして本当にすばらしい
Go が UUID 生成をサポートすること自体はあまり気にしないが、標準 UUID 型 ができるのは本当に重要だ
JSON、Text、database/sql などで一貫したマーシャリングが可能になる
最近の Go 依存関係分析では google/uuid が 2 番目に多く使われるパッケージだった
関連分析: The most popular Go dependency
Go の魅力は 派手な機能より実用性 にある
言語が崩れるほど複雑にはならず、必要な機能だけを追加している
互換性保証 のおかげで安心して使える。変化は遅いが着実に良くなっていく言語だ
Google の uuid パッケージが非アクティブになっていることよりも、gofrs/uuid が新しい標準に従い活発に保守されている点のほうが重要だと思う
gofrs/uuid リポジトリ
issue #194
UUID は本当に嫌いだ。人間にやさしくない識別子 だ
デバッグやクエリ結果で長すぎて扱いづらい。
もちろん完全に分離されたシステム間で一意な ID が必要なときには役立つが、たいていは乱用されている
一般的なケースでは 集中型の番号発行器 のほうがずっとよい。
たとえば DB の GetNextId のような手続きのほうが人間的で効率的だ
結果として 人が読めないコード になってしまい、しかも自前実装だったので妙に連番っぽかった。完全にひどい決定だった
Postgres でカウンタテーブルを使えば毎秒数万件の ID を生成できる
こうすると メモリ節約、圧縮効率、ハッシュマップ性能 まで良くなる
UUID は便利だが性能を壊す
例:
BASKETBALL-...-FISHのような形で 単語ベースのチェックサム を付ければ覚えやすいGo に UUID が本当に追加されるのか気になっていた
特別な反対がなければ含まれる可能性が高い
Kotlin も最近 2.3 バージョンで RFC 9562 ベースの UUID バージョン対応 を標準ライブラリに追加した
JVM、JS、WASM、Native をすべてサポートしている。
IETF RFC が安定化した以上、Go もそれに続くのは妥当だ
Go にこうした 基本機能のサポート不足 があるのは惜しい
個人的には Go の ロギングシステム があまりに単純で、自分で実装しなければならなかった
slog モジュールは遅くて使いづらい。エンタープライズ環境だけを考えているように見える
v7 の DB クラスタリング効率 と v4 の ランダム性 を同時に得る方法はないかと考えた
内部では v7 を使い、外部に出すとき XOR や AES でスクランブル すれば実現できそうだ
たとえば Feistel 暗号 を使えば UUID の性能問題なしに不透明な公開 ID を作れる