UUID v3ジェネレーター

Generate deterministic name-based UUID v3 using MD5

名前空間

6ba7b810-9dad-11d1-80b4-00c04fd430c8

名前

生成された UUID v3

名前を入力して「生成」をクリック
同じ名前空間 + 名前は常に同じ UUID を生成します
Note:UUID v3 は MD5 ハッシュを使用するレガシーフォーマットです。決定論的 UUID が必要な新規開発には UUID v5(SHA-1)を優先してください。汎用の一意 ID には UUID v4 を使用してください。

UUID v3 とは何ですか?

UUID v3 は RFC 4122 で定義された名前ベースの UUID バージョンです。ランダムデータやタイムスタンプではなく、2 つの入力から決定論的に UUID を導出します:名前空間 UUID と名前文字列。名前空間 + 名前のペアは MD5 を使用してハッシュされ、結果のハッシュが UUID としてフォーマットされます。

UUID v3 の主な特性は決定論です:同じ名前空間と名前は常に、どのマシンでも、どの時刻でも同一の UUID を生成します。これはコンテンツアドレス指定に適しており、意味のある名前によって識別されるリソースの安定した識別子を生成します。

UUID v3 はハッシュ関数として MD5 を使用します。MD5 はセキュリティ目的では暗号学的に破られていると見なされているため、通常は新規開発には UUID v5(SHA-1 を使用)が優先されます。v3 も v5 もランダム性を提供しません——純粋に決定論的です。

標準名前空間

RFC 4122 は 4 つの事前割り当てされた名前空間 UUID を定義しています。標準名前空間を使用することで相互運用性が確保されます——2 つの独立した実装は同じ名前空間内の同じ名前に対して同じ UUID v3 を生成します:

名前空間UUID用途
DNS6ba7b810-9dad-11d1-80b4-00c04fd430c8完全修飾ドメイン名(例:'example.com')
URL6ba7b811-9dad-11d1-80b4-00c04fd430c8URL および URI(例:'https://example.com/resource')
OID6ba7b812-9dad-11d1-80b4-00c04fd430c8ISO オブジェクト識別子(例:'1.2.840.113556')
X.5006ba7b814-9dad-11d1-80b4-00c04fd430c8X.500 識別名(例:'cn=John,dc=example,dc=com')

任意の UUID をカスタム名前空間として使用することもできます——例えば、1 度生成してアプリケーションの定数として埋め込む UUID v4。これにより、独自の名前から UUID へのマッピング用のプライベート名前空間を作成できます。

UUID v3 vs UUID v5

UUID v3 と UUID v5 は構造的に同一です——どちらも決定論的な名前ベースの UUID です。唯一の違いはハッシュ関数です:

UUID v3
  • MD5 ハッシュを使用
  • 128 ビット出力(UUID サイズ)
  • RFC 4122 で定義
  • MD5 は暗号学的に破られている
  • すべての UUID ライブラリでサポート
UUID v5
  • SHA-1 ハッシュを使用
  • 160 ビットハッシュを 128 ビットに切り詰め
  • RFC 4122 で定義
  • SHA-1 はセキュリティ用途では非推奨だが MD5 より強力
  • すべての UUID ライブラリでサポート

すべての新規開発では UUID v3 より UUID v5 を優先してください。SHA-1 ハッシュは MD5 より強力で、パフォーマンスの差は無視できます。すでにそれを使用しているシステムからの UUID を再現する必要がある場合のみ UUID v3 を使用してください。

UUID v3 を使用するタイミング

UUID v3(と v5)は、意味のある名前から安定した再現可能な識別子を導出する必要がある場合に適しています——保存と検索が必要なランダム ID ではなく:

URL 正規化
任意の URL に対して決定論的な UUID を生成し、マッピングテーブルを保存せずにデータベースやキャッシュのコンパクトな固定長キーとして使用します。
DNS ベースの識別子
ホスト名やドメイン名に安定した UUID を割り当て、デプロイメントやデータベース間で一貫性を保ちます。
コンテンツアドレス指定
標準名によって識別されるコンテンツアイテム——記事、製品、または設定キー——の再現可能な ID を作成します。
冪等リソース作成
同じリソース名に同じ UUID を生成することで、繰り返し作成の試みが検索なしに自然に冪等になります。
テストフィクスチャ
テストデータで安定した予測可能な UUID を生成し、テストを再実行する際にテストアサーションを更新する必要がないようにします。
クロスシステム重複排除
2 つの独立したシステムが通信なしに同じ名前に対して同じ UUID を導出でき、共有 ID レジストリなしに重複排除を可能にします。

決定論の理解

UUID v3 の決定論はその最大の強みであり、最も重要な制約でもあります。任意の名前空間 UUID と任意の名前文字列が与えられると、出力 UUID は完全に固定されます——ランダム性は関与しません。これは次のことを意味します:

例(DNS 名前空間、名前 = 'example.com'):9073926b-929f-31c2-abc9-fad77ae3e8eb

常に生成されます:9073926b-929f-31c2-abc9-fad77ae3e8eb

攻撃者が名前空間を知り、名前を推測できる場合、UUID を事前に計算できます。UUID v3 値は予測不可能なトークン、セッション ID、またはシークレットとして使用すべきではありません。セキュリティに敏感な識別子には UUID v4 を使用してください。

コード例

UUID v3 には名前空間 UUID名前文字列が必要です。標準の uuid パッケージを使用してください:

JavaScript / Node.js
// Browser / Node.js — UUID v3 without dependencies
function uuidV3(namespace, name) {
  // namespace must be a UUID string like '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
  const nsBytes = namespace.replace(/-/g, '').match(/../g).map(h => parseInt(h, 16))
  const nameBytes = [...new TextEncoder().encode(name)]
  const combined = new Uint8Array([...nsBytes, ...nameBytes])

  // md5(combined) — use your preferred MD5 library or the inline implementation
  const hash = md5(combined) // returns Uint8Array(16)
  hash[6] = (hash[6] & 0x0f) | 0x30 // version 3
  hash[8] = (hash[8] & 0x3f) | 0x80 // variant

  const h = [...hash].map(b => b.toString(16).padStart(2, '0')).join('')
  return `${h.slice(0,8)}-${h.slice(8,12)}-${h.slice(12,16)}-${h.slice(16,20)}-${h.slice(20)}`
}

// Using the 'uuid' npm package
import { v3 as uuidv3 } from 'uuid'
const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
console.log(uuidv3('example.com', uuidv3.DNS))
// → '9073926b-929f-31c2-abc9-fad77ae3e8eb' (always the same)
Python
import uuid

# Using the standard library
dns_uuid = uuid.uuid3(uuid.NAMESPACE_DNS, 'example.com')
print(dns_uuid)
# → 9073926b-929f-31c2-abc9-fad77ae3e8eb

url_uuid = uuid.uuid3(uuid.NAMESPACE_URL, 'https://example.com/page')
print(url_uuid)

# Custom namespace
MY_NS = uuid.UUID('a1b2c3d4-e5f6-7890-abcd-ef1234567890')
custom = uuid.uuid3(MY_NS, 'my-entity-name')
print(custom)
Go
package main

import (
    "fmt"
    "github.com/google/uuid"
)

func main() {
    // Standard DNS namespace
    ns := uuid.MustParse("6ba7b810-9dad-11d1-80b4-00c04fd430c8")
    id := uuid.NewMD5(ns, []byte("example.com"))
    fmt.Println(id)
    // → 9073926b-929f-31c2-abc9-fad77ae3e8eb

    // URL namespace
    urlNS := uuid.MustParse("6ba7b811-9dad-11d1-80b4-00c04fd430c8")
    idURL := uuid.NewMD5(urlNS, []byte("https://example.com/page"))
    fmt.Println(idURL)
}

よくある質問

UUID v3 と UUID v5 は互換性がありますか?
いいえ——異なるハッシュ関数(MD5 vs SHA-1)を使用するため、同じ入力に対して異なる出力を生成します。同じ名前空間 + 名前から生成された UUID v3 と UUID v5 は異なる UUID になります。互換性はありませんが、構造とユースケースにおいて機能的に同等です。
UUID v3 は衝突耐性がありますか?
特定の名前空間内では、MD5 がそれらの特定の入力に対して衝突を生成しない限り、2 つの異なる名前は異なる UUID v3 値を生成します。MD5 衝突攻撃は存在しますが、精巧に細工された入力が必要です——実際には、自然に発生する名前(URL、ドメイン名、製品 ID)は衝突しません。より高い保証のためには UUID v5 を使用してください。
UUID v3 をデータベースの主キーとして使用できますか?
はい、トレードオフを理解している場合。UUID v3 は決定論的であるため、同じ名前に対して同じキーが生成されます——これは自然な冪等性を提供します。ただし、UUID v3 は生成順序でソートできず、インデックスの断片化は UUID v4 と同様に適用されます。時間順のソート可能な主キーには UUID v7 を使用してください。
名前入力にはどのエンコーディングを使用すべきですか?
RFC 4122 は、名前を名前空間の標準形式を使用してバイトに変換すべきと指定しています。DNS 名前空間の場合は、末尾のドットなしの UTF-8 文字列としてドメイン名を使用してください。URL 名前空間の場合は、完全な URL の UTF-8 文字列を使用してください。常に同じエンコーディングを一貫して使用してください——同じ論理名の異なるエンコーディングは異なる UUID を生成します。
UUID v3 は元の名前を隠しますか?
MD5 は一方向関数です——UUID v3 から元の名前を逆算することはできません。ただし、攻撃者が名前空間を知り、可能な名前の小さなセットを疑っている場合、各候補に対して UUID v3 値を事前計算して比較できます。小さいまたは予測可能なスペースの名前には UUID v3 は機密性を提供しません。不透明で推測不可能な識別子が必要な場合は UUID v4 を使用してください。