JavaでUUIDを生成する方法

JavaでのUUID生成方法を解説。java.util.UUIDのメソッド、v4・v3の組み込みサポート、v7の生成方法、Hibernate/JPA連携をコード例付きで紹介します。

Usage

詳細な説明

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メッセージキーに不可欠です。

試してみる — UUID Generator

フルツールを開く