UUID в JVM #

Васильев Андрей Михайлович

Версии презентации

UUID #

Universally Unique Identifier, универсально уникальный идентификатор, — 128-битная метка

  • Если пользоваться установленными правилами создания, то UUID будут уникальны в распределённых системах для решения практических задач
  • Уникальность достигается алгоритмом генерации, который не включает общение с центральным брокером
  • Широко применяется в современных информационных системах

Существует несколько RFC, фиксирующих правила генерации и обработки этих данных, последний был опубликован в 2024 году: RFC 9562

Текстовое представление #

В каноническом представлении UUID изображают в виде числа в шестнадцатеричной системе счисления, разделённого дефисами на пять групп в формате 8-4-4-4-12. Такое представление занимает 36 символов:

123e4567-e89b-12d3-a456-426655440000
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

4 бита M обозначают версию («version») UUID, а 1-3 старших бита N обозначают вариант («variant») UUID

Общее количество уникальных ключей UUID (без учёта версий) составляет

  • 2 в 128 степени
  • Либо 256 в 16 степени
  • Примерно 3.4 на 10 в 38 степени

Это означает, что генерируя 1 триллион ключей каждую наносекунду, перебрать все возможные значения удастся лишь за 10 миллиардов лет

java.util.UUID #

Начиная с версии 1.5 Java предоставляется класс java.util.UUID

Для создания объекта UUID можно воспользоваться:

  • Конструктором, который ожидает два базовых числа, использующиеся при формировании UUID
  • Статической функцией randomUUID() для получения случайного значения, что соответствует 4-й версии UUID
  • Статической функцией nameUUIDFromBytes() для получения 3-й версии UUID из набора байт
  • Статической функцией fromString() для получения UUID из строкового представления. В случае проблемы с форматом будет выброшено исключение IllegalArgumentException

Объекты класса являются неизменяемыми и реализуют интерфейс Comparable, поэтому объекты UUID можно сравнивать друг с другом методом compareTo

Для преобразования к строковому представлению можно воспользоваться стандартной функцией toString()

val id: UUID = UUID.randomUUID()
val parsed: UUID =
    UUID.fromString("123e4567-e89b-12d3-a456-426655440000")
println(id.toString())