UUID version 6の提案仕様

[2021/04/28追記] 新しく提案仕様が出たので、新しく記事を書きました
asnokaze.hatenablog.com


先日IETFに提出された「UUID Format Update」という提案仕様の中でUUID version 6のフォーマットが言及されている。このDraftはUUIDを定義しているRFC4122を更新するものです。

ただ、まだIndividual Draftのdraft 00であり、この提案自体どうなるかは全くわからない点に注意が必要。

なお、UUIDv6自体はこの提案を行っているBrad G. Peabody氏が以前から取り組んでいた模様で、4年以上まえから案は存在していたようだ(URL)。またそのタイミングでサンプル実装も公開している。

UUIDv6

この提案仕様の中で、UUIDをデータベースのプライマリキーとして使用する際の課題をあげている。時系列順に並び替えるために他のデータが必要なことや、B-treeにデータを挿入する際に局所性がなくランダムな書き込みになってしまうことが挙げられている。
(UUIDv1はタイムスタンプが付くが、MACアドレスを使うので問題がある)

UUIDv6では、特殊な操作なく単純なソートで時系列順にでき、利用時にアクセスの局所性を持つ様になっている。(ULIDと似ている)

UUIDv6の構造

他のUUIDバージョンと同様128bitからなる。前半の64bit部分がタイムスタンプの機能、後半64bit部分がランダム性を持つことになる。

前半64bitの前方から

  • 48bit: タイムスタンプ
  • 4bit: バージョン(互換性を保つためこの位置となっている)
  • 12bit: タイムスタンプ続き

タイムスタンプ(60bit)は、RFC4122と同様「1582年10月15日(カトリック教会におけるグレゴリオ暦の実施日)0時0分からの経過時間を100ナノ秒単位で計測した数値。」(引用: wikipedia UUID)

後半64bit(既存のUUID RFC4122 と同様)

  • 16bit: clock seq
  • 48bit: node

となっている。ただし、この後半部分はアプリケーションやサーバ固有の識別子、乱数などで埋めることが許可されています。

Base64 Text / Base32 Text

(この記事では、Base64 TextとBase32 Textについての記述を追記予定です。)

終わりに

議論は古くからありますが、individual draftの初版が出たことで、それにたいするフィードバックが始まっています。
来月開催される、Dispatch WGで取り上げられるかもしれません。
https://mailarchive.ietf.org/arch/browse/ietf/?q=uuid