UUID v3ジェネレーター
Generate deterministic name-based UUID v3 using MD5
名前空間
6ba7b810-9dad-11d1-80b4-00c04fd430c8
名前
生成された UUID v3
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 | 用途 |
|---|---|---|
| DNS | 6ba7b810-9dad-11d1-80b4-00c04fd430c8 | 完全修飾ドメイン名(例:'example.com') |
| URL | 6ba7b811-9dad-11d1-80b4-00c04fd430c8 | URL および URI(例:'https://example.com/resource') |
| OID | 6ba7b812-9dad-11d1-80b4-00c04fd430c8 | ISO オブジェクト識別子(例:'1.2.840.113556') |
| X.500 | 6ba7b814-9dad-11d1-80b4-00c04fd430c8 | X.500 識別名(例:'cn=John,dc=example,dc=com') |
任意の UUID をカスタム名前空間として使用することもできます——例えば、1 度生成してアプリケーションの定数として埋め込む UUID v4。これにより、独自の名前から UUID へのマッピング用のプライベート名前空間を作成できます。
UUID v3 vs UUID v5
UUID v3 と UUID v5 は構造的に同一です——どちらも決定論的な名前ベースの UUID です。唯一の違いはハッシュ関数です:
- MD5 ハッシュを使用
- 128 ビット出力(UUID サイズ)
- RFC 4122 で定義
- MD5 は暗号学的に破られている
- すべての UUID ライブラリでサポート
- 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 ではなく:
決定論の理解
UUID v3 の決定論はその最大の強みであり、最も重要な制約でもあります。任意の名前空間 UUID と任意の名前文字列が与えられると、出力 UUID は完全に固定されます——ランダム性は関与しません。これは次のことを意味します:
常に生成されます:9073926b-929f-31c2-abc9-fad77ae3e8eb
攻撃者が名前空間を知り、名前を推測できる場合、UUID を事前に計算できます。UUID v3 値は予測不可能なトークン、セッション ID、またはシークレットとして使用すべきではありません。セキュリティに敏感な識別子には UUID v4 を使用してください。
コード例
UUID v3 には名前空間 UUID と名前文字列が必要です。標準の uuid パッケージを使用してください:
// 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)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)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)
}