JavaでUUIDを生成する方法
JavaでのUUID生成方法を解説。java.util.UUIDのメソッド、v4・v3の組み込みサポート、v7の生成方法、Hibernate/JPA連携をコード例付きで紹介します。
詳細な説明
Javaには java.util.UUID を通じた組み込みのUUIDサポートがあり、Java 5から利用可能です。ただし、標準ライブラリが直接サポートするのはv3(名前ベースMD5)とv4(ランダム)のみです。v7にはJava 21以降またはサードパーティライブラリが必要です。
UUID v4(ランダム):
import java.util.UUID;
UUID id = UUID.randomUUID();
System.out.println(id); // e.g., 550e8400-e29b-41d4-a716-446655440000
System.out.println(id.version()); // 4
System.out.println(id.variant()); // 2 (RFC 4122)
System.out.println(id.getMostSignificantBits());
System.out.println(id.getLeastSignificantBits());
UUID v3(名前ベースMD5):
// Java only provides nameUUIDFromBytes (v3, no namespace parameter)
UUID id = UUID.nameUUIDFromBytes("example.com".getBytes());
System.out.println(id.version()); // 3
Javaの nameUUIDFromBytes は名前空間UUIDを受け付けないことに注意してください。入力バイトを直接MD5でハッシュします。名前空間をサポートする適切なv5(SHA-1)には、com.github.f4b6a3:uuid-creator などのライブラリを使用してください。
UUID v7(Java 21以降またはライブラリ):
// Java 21+ (JEP proposal, check current status)
// UUID id = UUID.timeOrderedRandom(); // Proposed API
// Using uuid-creator library (works on any Java 8+):
// Maven: com.github.f4b6a3:uuid-creator:5.3.7
import com.github.f4b6a3.uuid.UuidCreator;
UUID v7 = UuidCreator.getTimeOrderedEpoch(); // UUID v7
UUID v1 = UuidCreator.getTimeBased(); // UUID v1
UUID v5 = UuidCreator.getNameBasedSha1(UuidCreator.NAMESPACE_DNS, "example.com");
パースとバリデーション:
// Parse from string
UUID id = UUID.fromString("550e8400-e29b-41d4-a716-446655440000");
// Validation (fromString throws IllegalArgumentException for invalid input)
try {
UUID.fromString(input);
return true;
} catch (IllegalArgumentException e) {
return false;
}
Hibernate/JPA連携:
import jakarta.persistence.*;
import java.util.UUID;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private UUID id; // Hibernate 6.2+ generates v4 by default
// For v7, use a custom generator:
@Id
@GenericGenerator(name = "uuid7", type = UuidV7Generator.class)
@GeneratedValue(generator = "uuid7")
private UUID id;
}
パフォーマンスに関する考慮事項: Javaの UUID.randomUUID() は SecureRandom を使用しており、Linuxでは /dev/random が枯渇するとブロックされる可能性があります。高スループットのシナリオでは、JVMに -Djava.security.egd=file:/dev/./urandom を設定して /dev/urandom を使用するよう構成してください。最新のLinuxカーネル(5.6以降)ではブロッキング動作が解消されており、この問題は軽減されています。
ソートに関する注意点: Javaの UUID.compareTo() は内部のlong値を符号付きとして比較するため、文字列表現と同じ辞書順ソートにはなりません。正しい辞書順ソートには、文字列形式で比較するか符号なし比較を使用してください。
ユースケース
JavaでのUUID生成は、Spring Bootマイクロサービスにおけるエンティティ識別子の作成、分散トレーシングの相関ID、パーティショントピックの順序付けのためのKafkaメッセージキーに不可欠です。