← 返回博客

Java 中如何生成 UUID

2026-04-08 · 5 分钟阅读

java.util.UUID 类基础用法

Java 从 1.5 版本起提供了内置的 java.util.UUID 类,无需额外依赖。UUID.randomUUID() 方法生成 UUID v4(随机),是最常用的方法。UUID 类还提供了解析、比较和格式化 UUID 的方法。UUID 对象是不可变的(immutable),是线程安全的,可以在并发环境中安全使用。

import java.util.UUID;

public class UUIDExample {
    public static void main(String[] args) {
        // 生成 UUID v4
        UUID uuid = UUID.randomUUID();
        System.out.println(uuid);                    // 标准格式
        System.out.println(uuid.toString());          // 同上
        System.out.println(uuid.toString().toUpperCase()); // 大写
        System.out.println(uuid.toString().replace("-", "")); // 无连字符

        // 获取 UUID 字段
        System.out.println(uuid.version());    // 4
        System.out.println(uuid.variant());    // 2 (IETF)
        System.out.println(uuid.getMostSignificantBits());
        System.out.println(uuid.getLeastSignificantBits());

        // 解析 UUID 字符串
        UUID parsed = UUID.fromString("550e8400-e29b-41d4-a716-446655440000");
        System.out.println(parsed.version()); // 4

        // 从字节数组创建
        byte[] bytes = new byte[16]; // 需要填充
        UUID fromBytes = new UUID(
            java.nio.ByteBuffer.wrap(bytes, 0, 8).getLong(),
            java.nio.ByteBuffer.wrap(bytes, 8, 8).getLong()
        );
    }
}

在 Spring Boot 中使用 UUID 主键

// Spring Boot + JPA 实体示例
import jakarta.persistence.*;
import java.util.UUID;

@Entity
@Table(name = "orders")
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(columnDefinition = "uuid", updatable = false)
    private UUID id;

    // 或者手动指定生成方式
    @Id
    @Column(nullable = false, updatable = false)
    private UUID id = UUID.randomUUID();

    private String customerName;
    private double amount;

    // 使用 @GenericGenerator (Hibernate)
    // @GeneratedValue(generator = "uuid2")
    // @GenericGenerator(name = "uuid2", strategy = "uuid2")
    // private String id;
}

UUID 作为 REST API 路径参数

// Spring MVC Controller 示例
import org.springframework.web.bind.annotation.*;
import java.util.UUID;

@RestController
@RequestMapping("/api/users")
public class UserController {

    @GetMapping("/{id}")
    public ResponseEntity getUser(@PathVariable UUID id) {
        // Spring 自动将路径参数字符串转换为 UUID 对象
        // 如果格式不合法,自动返回 400 Bad Request
        return userService.findById(id)
            .map(ResponseEntity::ok)
            .orElse(ResponseEntity.notFound().build());
    }

    @PostMapping
    public ResponseEntity createUser(@RequestBody CreateUserRequest request) {
        UUID newId = UUID.randomUUID();
        User user = userService.create(newId, request);
        URI location = URI.create("/api/users/" + newId);
        return ResponseEntity.created(location).body(user);
    }
}

UUID 的字符串验证

import java.util.UUID;
import java.util.regex.Pattern;

public class UUIDValidator {

    private static final Pattern UUID_PATTERN = Pattern.compile(
        "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-7][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"
    );

    // 方法1:使用正则表达式(严格格式检查)
    public static boolean isValidUUID(String str) {
        return str != null && UUID_PATTERN.matcher(str).matches();
    }

    // 方法2:使用 UUID.fromString(会接受一些非标准格式)
    public static boolean isValidUUIDLoose(String str) {
        try {
            UUID.fromString(str);
            return true;
        } catch (IllegalArgumentException e) {
            return false;
        }
    }
}

批量生成 UUID 的高效方式

import java.util.UUID;
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class BatchUUIDGenerator {

    // 生成指定数量的 UUID 列表
    public static List generate(int count) {
        return IntStream.range(0, count)
            .mapToObj(i -> UUID.randomUUID().toString())
            .collect(Collectors.toList());
    }

    // 生成无连字符格式
    public static List generateCompact(int count) {
        return IntStream.range(0, count)
            .mapToObj(i -> UUID.randomUUID().toString().replace("-", ""))
            .collect(Collectors.toList());
    }

    public static void main(String[] args) {
        List uuids = generate(1000);
        System.out.println("Generated: " + uuids.size() + " UUIDs");
        System.out.println("First: " + uuids.get(0));
    }
}

UUID 在 Kotlin 中的使用

// Kotlin 示例(使用 Java UUID 类)
import java.util.UUID

// 基本用法
val id: UUID = UUID.randomUUID()
val idStr: String = id.toString()

// 扩展函数让代码更简洁
fun String.toUUID(): UUID = UUID.fromString(this)
fun String.toUUIDOrNull(): UUID? = try { UUID.fromString(this) } catch (e: IllegalArgumentException) { null }

// 使用
val uuid = "550e8400-e29b-41d4-a716-446655440000".toUUID()
val maybeUuid = "invalid".toUUIDOrNull() // null

// data class 中使用
data class Product(
    val id: UUID = UUID.randomUUID(),
    val name: String,
    val price: Double
)

立即免费使用相关工具

免费使用 →