Какую версию UUID использовать?

Какую версию UUID следует использовать? Я видел много потоков, объясняющих, что каждая версия влечет за собой, но мне трудно понять, что лучше для каких приложений.

Ответ 1

Существует два разных способа создания UUID.

Если вам просто нужен уникальный идентификатор, вам нужна версия 1 или версия 4.

  • Версия 1: генерирует уникальный идентификатор на основе MAC-адреса сетевой карты и таймера. Эти идентификаторы легко предсказать (учитывая, что я мог бы угадать еще один), и их можно проследить до вашей сетевой карты. Не рекомендуется создавать их.

  • Версия 4: они генерируются из случайных (или псевдослучайных) чисел. Если вам просто нужно создать UUID, это, вероятно, то, что вы хотите.

Если вам нужно всегда генерировать один и тот же идентификатор UUID с заданным именем, вам нужна версия 3 или версия 5.

  • Версия 3: генерирует уникальный идентификатор из хэша MD5 пространства имен и имени. Если вам нужна обратная совместимость (с другой системой, которая генерирует UUID от имен), используйте это.

  • Версия 5: генерирует уникальный идентификатор из хэша SHA-1 пространства имен и имени. Это предпочтительная версия.

Ответ 2

Если вы хотите случайное число, используйте библиотеку случайных чисел. Если вам нужен уникальный идентификатор с эффективностью 0.00... еще много 0s здесь... Вероятность столкновения 001%, вы должны использовать UUIDv1. См. Комментарий Nick для UUIDv3 и v5.

UUIDv1 НЕ безопасен. Это не должно быть. Он должен быть УНИКАЛЬНЫМ, не недопустимым. UUIDv1 использует текущую временную метку, плюс идентификатор машины, а также некоторые случайные вещи, чтобы сделать число, которое никогда не будет генерироваться этим алгоритмом снова. Это подходит для идентификатора транзакции (даже если каждый делает миллионы транзакций/с).

Честно говоря, я не понимаю, почему UUIDv4 существует... из чтения RFC4122, it похоже, что эта версия НЕ исключает вероятность столкновений. Это просто генератор случайных чисел. Если это правда, то у вас есть очень хороший шанс для двух машин в мире, создающих в то же время "UUID" v4 (цитаты из-за отсутствия механизма обеспечения U.niversal U.niqueness). В этой ситуации я не думаю, что этот алгоритм принадлежит RFC, описывающему методы генерации уникальных значений. Он будет принадлежать RFC о создании случайности. Для набора случайных чисел:

chance_of_collision = 1 - (set_size! / (set_size - tries)!) / (set_size ^ tries)

Ответ 3

Это очень общий вопрос. Один ответ: "это зависит от того, какой UUID вы хотите создать". Но лучше: "Хорошо, прежде чем я отвечу, вы можете рассказать нам, почему вам нужно кодировать собственный алгоритм генерации UUID вместо вызова функций генерации UUID, которые предоставляют большинство современных операционных систем?"

Делать это проще и безопаснее, и, поскольку вам, вероятно, не нужно создавать свои собственные, зачем беспокоиться о кодировании реализации? В этом случае ответ будет использоваться независимо от вашего O/S, языка программирования или рамки. Например, в Windows существует CoCreateGuid или UuidCreate или одна из различных оболочек, доступных из многочисленных фреймворков в использовании. В Linux есть uuid_generate.

Если вам по какой-то причине абсолютно необходимо создавать свои собственные, то по крайней мере иметь хороший смысл держаться подальше от генерации UUID v1 и v2. Это сложно сделать правильно. Вместо этого используйте вместо UUID v3, v4 или v5.

Обновление: В комментарии вы упомянули, что используете Python и ссылаетесь на . Просматривая предоставленный интерфейс, самым простым вариантом для вас было бы создание UUID v4 (то есть, созданного из случайных данных), вызывая uuid.uuid4().

Если у вас есть данные, которые вам нужны (или могут) хэш для генерации UUID, то вы можете использовать либо v3 (который полагается на MD5), либо v5 (который полагается на SHA1). Создание UUID v3 или v5 прост: сначала выберите тип UUID, который вы хотите сгенерировать (вероятно, выберете v5), а затем выберите подходящее пространство имен и вызовите функцию с данными, которые вы хотите использовать для генерации UUID. Например, если вы используете хэширование URL-адреса, вы должны использовать NAMESPACE_URL:

uuid.uuid3(uuid.NAMESPACE_URL, 'https://ripple.com')

Обратите внимание, что этот UUID будет отличаться от UUID v5 для того же URL-адреса, который создается следующим образом:

uuid.uuid5(uuid.NAMESPACE_URL, 'https://ripple.com')

Хорошим свойством URL-адресов v3 и v5 является то, что они должны быть совместимы между реализациями. Другими словами, если две разные системы используют реализацию, которая соответствует RFC4122, они будут (или, по крайней мере, должны) генерировать один и тот же UUID, если все остальные вещи равны (т.е. Генерируют ту же самую версию UUID, с тем же пространством имен и одинаковые данные). Это свойство может быть очень полезно в некоторых ситуациях (особенно в сценариях с учетом контента), но, возможно, не в вашем конкретном случае.