UUID Version 5 (SHA-1名前ベース)
UUID v5を解説。名前空間と名前をSHA-1でハッシュして決定論的にUUIDを生成する仕組み。同じ入力からは常に同じUUIDが出力されます。
詳細な説明
UUID Version 5は、名前空間UUIDと名前文字列をSHA-1でハッシュすることで決定論的な識別子を生成します。同じ名前空間と名前を与えれば常に同じUUIDが生成されるため、既存のデータから再現可能な識別子を作成するのに最適です。
アルゴリズム:
- 名前空間UUIDの16バイトと名前のUTF-8バイトを連結する
- SHA-1ハッシュを計算する(20バイトの出力)
- ハッシュの最初の16バイトを取得する
- バージョンビット(ビット48-51)を
0101(5)に設定する - バリアントビット(ビット64-65)を
10に設定する
事前定義された名前空間(RFC 4122より):
6ba7b810-9dad-11d1-80b4-00c04fd430c8-- DNS6ba7b811-9dad-11d1-80b4-00c04fd430c8-- URL6ba7b812-9dad-11d1-80b4-00c04fd430c8-- OID(ISO Object Identifier)6ba7b814-9dad-11d1-80b4-00c04fd430c8-- X.500 DN
例えば、uuid5(DNS, "example.com") は常に cfbff0d1-9375-5685-968c-48ce8b15ae17 を生成します。
v5とv4の使い分け: 同じ入力が常に同じUUIDにマッピングされる必要がある場合はv5を使用します。重複排除、冪等操作、自然キーからの安定した識別子の作成に役立ちます。入力データとは無関係にグローバルに一意なIDが必要な場合はv4を使用します。
v5 vs v3: UUID v3はSHA-1の代わりにMD5を使用します。RFC 9562では、SHA-1がMD5よりも優れたハッシュ分布と強力な衝突耐性を提供するため、v3よりもv5を推奨しています。ただし、ハッシュ出力のうち122ビットしか保持されないため、v3もv5も暗号学的なセキュリティ用途には使用すべきではありません。
コード例:
import uuid
# Python has built-in v5 support
id = uuid.uuid5(uuid.NAMESPACE_DNS, "example.com")
# cfbff0d1-9375-5685-968c-48ce8b15ae17
// Node.js with the 'uuid' package
import { v5 as uuidv5 } from 'uuid';
const id = uuidv5('example.com', uuidv5.DNS);
ストレージに関する注意: v5 UUIDは決定論的であるため、保存する代わりに再計算することが可能です。名前空間と名前が既知であるシステムでは、ストレージを節約できます。
ユースケース
UUID v5は、URLベースのリソース、設定キー、コンテンツアドレッサブルストレージなど、同じ論理エンティティが常に同じUUIDにマッピングされるべき場面で安定した識別子を生成するために広く使われています。