Upgrade to Pro — share decks privately, control downloads, hide ads and more …

UUID

Avatar for tesso tesso
August 29, 2026

 UUID

UUIDについてv1 ~ v8まで軽く調べてみました。UUIDについてサクッと見ていただければ嬉しいです。

これは 2026/08/29 の 好奇心発散LTで発表したものです。
https://gijutsu-club.connpass.com/event/399272/

Avatar for tesso

tesso

August 29, 2026

More Decks by tesso

Other Decks in Programming

Transcript

  1. UUIDとは Universally Unique Identifier / 汎用一意識別子 形式:xxxxxxxx-xxxx-Vxxx-Nxxx-xxxxxxxxxxxx 例:550e8400-e29b-41d4-a716-446655440000 • 16進数32桁

    (128bit) を 8-4-4-4-12 に区切る • ハイフン込みで36文字 • V はバージョン番号。例では 4 なのでUUIDv4 • N には「variant」が入り、現在標準のUUIDでは 8・9・a・b のいずれか なにかを識別するための仕組み
  2. UUID には色々なバージョンがある 作り方・特徴 主な用途 v1 時刻+クロックシーケンス+ノードID 古い分散システム。MACアドレスを使う場合は情報漏洩に注意 v2 v1を基にPOSIXのUID/GIDを埋め込む DCE

    Security向け。現行RFCでは予約扱いで、ほぼ使われない v3 名前空間+名前をMD5でハッシュ 同じ名前から毎回同じUUIDを作りたい場合 v4 ほぼすべてをランダム生成 汎用ID。最も一般的 v5 名前空間+名前をSHA-1でハッシュ v3と同じ用途。通常はv3よりこちら v6 v1の時刻部分を並べ替えて、時系列順にしたもの 時刻順に並べたいDBのID v7 Unix時刻(ミリ秒)+ランダム値 新しいシステムの時系列ID。DB用途に向く v8 中身を利用者が独自に定義できる予約枠 独自規格・実験的なID
  3. v1 0 31 32 47 48 51 52 63 +---------------------+-----------------+------+----------+

    | time_low (32) | time_mid (16) | ver | time_high| +---------------------+-----------------+------+----------+ 64 65 66 79 80 127 +-----+----------------------------+----------------------+ | var | clock_seq (14) | node (48) | +-----+----------------------------+----------------------+ 分散環境で一意なIDを生成できる! Good : 中央サーバーなしで分散生成できる Bad : 時刻や生成元の情報が漏れる(node ~ mac address)
  4. v2 0 31 32 47 48 51 52 63 +---------------------+------------------+------+----------+

    | local_id (32) | time_mid (16) | ver | time_high| +---------------------+------------------+------+----------+ 64 65 66 71 72 79 80 127 +-----+-----------+-----------+----------------------------+ | var | seq_hi(6) | domain(8) | node (48) | +-----+-----------+-----------+----------------------------+ v1の時刻・clock sequenceの一部をUID/GIDとその種類に置き換えた。 Good : UUIDからUID/GIDを直接取り出せる。 Bad : UID/GIDなどの内部情報が露出する。実装がゆれる。
  5. v3 0 31 32 63 +---------------------+-----------------+ | md5_high (48) |ver|md5_mid

    (12) | +---------------------+---+-------------+ |var| md5_low (62) | +---+-----------------------------------+ md5 = MD5(`namespace UUID || canonical name`) MD5 : ハッシュアルゴリズム 同じ入力から常に同じUUIDを生成する Good : 同じ入力から常に同じUUID。固定長にできる。 Bad : MD5を使用している。nameの表記や値に出力が左右される。
  6. v4 0 31 32 63 +---------------------+-----------------+ | random_a (48) |ver|random_b(12)

    | +---------------------+---+-------------+ |var| random_c (62) | +---+-----------------------------------+ 有名なやつ。ランダム値をそのままUUIDとして採用 Good : ランダムなID。 Bad : 乱数器の品質による。DBとの相性が良くない。
  7. v5 0 31 32 63 +---------------------+-----------------+ | sha1_high (48) |ver|sha1_mid

    (12)| +---------------------+---+-------------+ |var| sha1_low (62) | +---+-----------------------------------+ sha1 = SHA1(`namespace UUID || canonical name`) SHA1 : ハッシュアルゴリズム 同じ入力から常に同じUUIDを生成する Good : 同じ入力から常に同じUUID。固定長にできる。 Bad : SHA1を使用している。nameの表記や値に出力が左右される。
  8. v6 0 31 32 47 48 51 52 63 +---------------------+-----------------+------+----------+

    | time_high (32) | time_mid (16) | ver | time_low| +---------------------+-----------------+------+----------+ 64 65 66 79 80 127 +-----+----------------------------+----------------------+ | var | clock_seq (14) | node (48) | +-----+----------------------------+----------------------+ 分散環境で一意なIDを生成できる!(v1のtimeの順序を変えた。) Good : 中央サーバーなしで分散生成できる。DBとの相性がいい。 Bad : 時刻や生成元の情報が漏れる(node ~ mac address)
  9. v7 0 31 63 +---------------------------------+-----------------+----+-----------+ | unix_ts_ms 32 bit| unix_ts_ms

    16bit|ver |rand_a 12 | +----------------+----+-----------+-----------------+----+-----------+ |var| rand_b 62 bit| +---+-----------------------------+----------------------------------+ 時間 + ランダムでUUIDを作成する Good : 時刻順に並ぶため、DBのインデックス効率がよい Bad : UUIDからおおよその生成時刻が分かる
  10. v8 0 31 +---------------------------------+----------------+----+-----------+ | custom_a 32 bit|custom_a 16 bit

    |ver |custom_b 12| +----------------+----+-----------+----------------+----+-----------+ |var| custom_c 62 bit| +--+----------------------------------------------------------------+ なんでもあり。好き勝手に使ってもらうためのv8 Good : 企業ごとのユースケースに沿ったUUIDをつくれる Bad : UUIDの形式である以上の情報はない。
  11. お好きな UUIDはありましたか? 作り方・特徴 主な用途 v1 時刻+クロックシーケンス+ノードID 古い分散システム。MACアドレスを使う場合は情報漏洩に注意 v2 v1を基にPOSIXのUID/GIDを埋め込む DCE

    Security向け。現行RFCでは予約扱いで、ほぼ使われない v3 名前空間+名前をMD5でハッシュ 同じ名前から毎回同じUUIDを作りたい場合 v4 ほぼすべてをランダム生成 汎用ID。最も一般的 v5 名前空間+名前をSHA-1でハッシュ v3と同じ用途。通常はv3よりこちら v6 v1の時刻部分を並べ替えて、時系列順にしたもの 時刻順に並べたいDBのID v7 Unix時刻(ミリ秒)+ランダム値 新しいシステムの時系列ID。DB用途に向く v8 中身を利用者が独自に定義できる予約枠 独自規格・実験的なID