Что такое UUID и как они создаются?

Взгляд на универсальные уникальные идентификаторы

Универсальный уникальный идентификатор (UUID) — это 128-битное число, которое идентифицирует информацию в компьютерной системе. Он также известен как глобальный уникальный идентификатор (GUID). Стандартное представление UUID обычно состоит из шестнадцатеричных цифр:

e5d520d8-d06e-4bc2-9bb9-a28e47014884

Всего вы видите 32 символа с четырьмя дефисами между ними. Чтобы соответствовать своему названию, ожидается, что UUID будет уникальным. Обычно это не так — их уникальность зависит от методов или алгоритмов, используемых для их создания. Однако, хотя это возможно, вероятность того, что UUID дублируется, достаточно близка к нулю, чтобы ею можно было пренебречь.

Есть разные способы вычисления UUID. Я объясню, в чем различия, и дам некоторое представление о реализациях.

Версия первая

UUID версии 1 — это универсальный уникальный идентификатор, который создается с использованием MAC-адреса компьютера и времени создания.

Означает ли это, что UUID первой версии уникален? Что ж, они в значительной степени таковы. Для обеспечения уникальности существует ограничение в 163 миллиарда в секунду на компьютере (или узле), но это не то, с чем вы часто сталкиваетесь как разработчик.

Есть и другие проблемы, о которых нужно беспокоиться с этой версией. Почти гарантированная уникальность достигается за счет анонимности. Поскольку эта версия требует времени и уникального MAC-адреса, можно определить адрес и время компьютера.

Версия вторая

Я буду кратко обсуждать версию второй. UUID версии 2 аналогичны идентификаторам UUID версии 1 и не часто реализуются, поскольку RFC 4122 не содержит подробностей. На практике вы вообще не будете их использовать. Их также называют UUID безопасности DCE.

См. также:  Что происходит, когда вы запускаете «gcc main.c»?

Версия третья

В третьей версии для генерации UUID используются криптографическое хеширование и текстовые строки, предоставляемые приложением. В этой версии используется хеширование MD5. UUID генерируются из имен. Теперь мы можем использовать имя и пространство имен для создания серии UUID. Алгоритм хеширования MD5 — это широко используемая хеш-функция, которая производит 128-битное хеш-значение.

Первоначально MD5 был разработан для использования в качестве криптографической хеш-функции, но теперь, похоже, в нем есть проблемы с уязвимостью. Слишком легко найти два разных сообщения с одним и тем же значением хэша. По этой причине это не та версия, которую вы хотите использовать в своем приложении.

Версия четвертая

Генератор псевдослучайных чисел, также известный как детерминированный генератор случайных битов, представляет собой алгоритм для генерации последовательности чисел, свойства которой аппроксимируют свойства последовательностей случайных чисел. — Википедия

Эта версия использует генератор псевдослучайных чисел для генерации UUID. Очень просто использовать. Каждый бит строки генерируется полностью «случайным образом». По-прежнему существует вероятность того, что UUID может быть продублирован, но он крошечный из-за большого количества возможных комбинаций. Точное количество возможностей составляет около «м²».

На сегодняшний день четвертая версия имеет реализации на большинстве языков программирования. Очень легко использовать. Приведу пример на Java:

UUID uuid = UUID.randomUUID();

Версия пятая

Единственная разница между версией 3 и версией 5 заключается в том, что используется другой алгоритм хеширования. В пятой версии вместо MD5 используется SHA-1. Хотя это технически более совершенный алгоритм хеширования, он также может иметь те же проблемы, что и версия 3. Не рекомендую его использовать.

Заключение

Большим преимуществом UUID является то, что он практически уникален (в отличие от гарантированного уникального), что вполне приемлемо для повседневного использования.

См. также:  Моно-репо или мульти-репо? Зачем выбирать одно, если можно и то, и другое?

Вот основные недостатки UUID:

  • Например, вместо использования индекса, который увеличивается каждый раз, когда запись вставляется в базу данных, необходимо сгенерировать UUID. Это может занять больше времени. Он ничего не говорит о порядке создания. Если вам нужен порядок, подумайте о том, чтобы не использовать UUID для сортировки по чему-либо, кроме идентификатора.
  • С ними может быть немного странно работать. UUID ничего не говорит о сущности, которой он принадлежит. Это может затруднить отладку, особенно в тестах.
  • Это довольно длинное значение, которое может снизить производительность. Однако в наши дни пространство дешевле.

Но у него есть и некоторые важные преимущества:

  • Основное преимущество UUID в том, что он уникален. Например, пользователю практически невозможно угадать его как параметр URL (открыто для обсуждения, поскольку это может быть проблемой безопасности). И они уникальны для разных приложений.
  • Это не зависит от окружающей среды. Вы можете создать его где угодно (даже в автономном режиме), и вы не полагаетесь на базу данных для создания идентификатора. Когда у вас есть несколько баз данных, содержащих сегмент (осколок) ваших данных, UUID уникален для всех баз данных, а не только для той, в которой вы сейчас находитесь. Это делает перемещение данных между базами данных намного безопаснее.

Хотя почти каждая версия имеет свои сильные стороны, у них также есть явные недостатки, которые могут навредить вам при разработке приложения.

Четвертая версия полностью случайна и непредсказуема, и это та версия, которую я бы рекомендовал использовать сейчас.

Если вы не хотите конфликтовать в нескольких экземплярах баз данных, не хотите, чтобы идентификаторы были предсказуемыми или предоставляли информацию о системе, рассмотрите возможность использования UUID.

Понравилась статья? Поделиться с друзьями:
IT Шеф
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: