Как создать UUID на основе строки в Java?

«Как создать UUID на основе строки в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, можно. Для этого используется статический метод UUID.nameUUIDFromBytes(), который генерирует UUID версии 3 (на основе MD5-хеша). Результат будет детерминированным: одна и та же строка всегда даст одинаковый UUID.

Базовый пример (UUID v3):

import java.nio.charset.StandardCharsets;
import java.util.UUID;

String inputString = "https://example.com/data";
UUID uuidFromString = UUID.nameUUIDFromBytes(
    inputString.getBytes(StandardCharsets.UTF_8)
);
System.out.println(uuidFromString); // Вывод: 5df41881-3aed-3515-88a7-2f4a814cf09e

UUID версии 5 (SHA-1): Стандартная библиотека Java не предоставляет прямой поддержки UUID v5. Для его создания нужна сторонняя библиотека или ручная реализация.

Пример с Apache Commons Id (если библиотека добавлена):

// Зависимость: org.apache.commons:commons-id
import org.apache.commons.id.uuid.UUIDV5;
UUID uuidV5 = UUIDV5.getUUID("example");

Важные замечания:

  1. Детерминированность: UUID, сгенерированный из строки, постоянен. Это полезно для создания стабильных идентификаторов одних и тех же сущностей (например, URL).
  2. Версия: nameUUIDFromBytes создает только UUID v3. UUID v5 считается более предпочтительным, так как использует более криптостойкий алгоритм SHA-1.
  3. Пространство имен: В стандарте RFC 4122 для v3/v5 также указывается пространство имен (например, DNS, URL). В примере выше используется кастомное пространство.