Что такое UUID в Java
UUID.randomUUID() входит в java.util с Java 5. Метод возвращает UUID версии 4 варианта 2, построенный на криптостойком генераторе, и это правильный выбор по умолчанию для идентификаторов запросов, ключей сущностей и корреляции в логах. Обратите внимание на вариант: JDK выдаёт вариант IETF, а не старую раскладку Microsoft, поэтому 17-й hex-символ всегда в диапазоне 8–b.
Если значение должно воспроизводиться, UUID.nameUUIDFromBytes(bytes) хэширует произвольные байты алгоритмом MD5 в UUID версии 3: один и тот же вход даёт один и тот же идентификатор в любой JVM. Встроенных v5 (SHA-1) и v7 в JDK нет, поэтому для упорядоченных по времени ключей, сохраняющих последовательность вставок в B-дерево, нужна библиотека, например uuid-creator, где UuidCreator.getTimeOrderedEpoch() создаёт значения v7.
Как использовать
- Вызовите
UUID.randomUUID()для случайного идентификатора v4. - Используйте
UUID.nameUUIDFromBytes(byte[]), когда значение должно выводиться из естественного ключа. - Подключите
uuid-creator, если нужен v7 и последовательные вставки в индекс.
Сценарии
- Идентификаторы сущностей и запросов в приложениях на Spring и Jakarta EE: случайный v4 не требует обращения к базе.
- Детерминированные ключи дедупликации: хэш составного бизнес-ключа стабилен между сервисами.
- Correlation id в логах и трассировке, где компактный шестнадцатеричный идентификатор удобнее для поиска.
Сравнение UUID в Java с другими форматами
| Вариант | Когда использовать |
|---|---|
UUID.randomUUID() | v4, криптостойкий, входит в JDK. |
UUID.nameUUIDFromBytes() | v3, MD5 от входа: детерминирован, но не устойчив к подбору входа. |
uuid-creator (библиотека) | Добавляет v6, v7 и v8; <code>getTimeOrderedEpoch()</code> даёт v7. |
Identity-столбец базы | Последовательный, но требует базы и раскрывает число строк. |
Примеры кода
Случайный v4
import java.util.UUID;
UUID id = UUID.randomUUID();
System.out.println(id); // 550e8400-e29b-41d4-a716-446655440000
System.out.println(id.version()); // 4
System.out.println(id.variant()); // 2
Детерминированный v3
import java.util.UUID;
import java.nio.charset.StandardCharsets;
UUID stable = UUID.nameUUIDFromBytes(
"user:42".getBytes(StandardCharsets.UTF_8));
// один入口 — один UUID в любой JVM
Упорядоченный v7 (библиотека)
// implementation 'com.github.f4b6a3:uuid-creator:6.0.0'
import com.github.f4b6a3.uuid.UuidCreator;
UUID v7 = UuidCreator.getTimeOrderedEpoch();
// 019535d9-3df7-79fb-b466-fa907fa17f9e
// Созданные позже значения сортируются позже — вставки идут последовательно
Разбор и проверка
import java.util.UUID;
try {
UUID parsed = UUID.fromString(input);
// корректный формат **и** допустимые hex-символы
} catch (IllegalArgumentException notAUuid) {
// отклонить ввод
}
Частые вопросы
Есть ли в Java встроенный UUID v7?
Нет. JDK содержит только v3 (nameUUIDFromBytes) и v4 (randomUUID). Для v7 нужна сторонняя библиотека — чаще всего uuid-creator, — либо генерация на стороне базы, например функцией uuidv7() в PostgreSQL 18.
Достаточно ли UUID.randomUUID() уникален для первичного ключа?
Статистически да: 122 случайных бита дают ту же вероятность коллизии, что и любой другой генератор v4. Практическая претензия к v4 не в коллизиях, а в локальности: случайные значения разбрасываются по B-дереву, и именно это исправляет v7.
Можно ли хранить UUID в long или массиве байт?
Да. У UUID есть getMostSignificantBits() и getLeastSignificantBits(), поэтому значение помещается в два long или, компактнее, в 16 байт столбца BINARY(16) — вдвое меньше строки из 36 символов.