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

uuid

79622 просмотра

4 ответа

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

Автор: user1802143 Источник Размещён: 13.11.2019 11:33

Ответы (4)


364 плюса

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

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

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

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

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

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

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

Автор: Gabe Размещён: 03.12.2013 03:37

46 плюса

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

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

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

chance_of_collision = 1 - (set_size! / (set_size - tries)!) / (set_size ^ tries)
Автор: anregen Размещён: 15.10.2014 03:55

15 плюса

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

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

Если вы, по какой - то причине абсолютно необходимо создать свой собственный, то , по крайней мере , есть смысл хорошо , чтобы держаться подальше от генерации v1 и v2 UUID , . Это сложно сделать это правильно. Вместо этого придерживайтесь 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 версии, с тем же пространством имен и те же данные). Это свойство может быть очень полезно в некоторых ситуациях (особенно в сценариях с адресным хранением), но, возможно, не в вашем конкретном случае.

Автор: Nik Bougalis Размещён: 03.12.2013 03:13

0 плюса

Документация Postgres описывает различия между UUIDs. Парочка из них:

V3:

uuid_generate_v3(namespace uuid, name text) - Эта функция генерирует UUID версии 3 в заданном пространстве имен, используя указанное имя ввода.

V4:

uuid_generate_v4 - Эта функция генерирует UUID версии 4, который полностью получен из случайных чисел.

Автор: Eugen Konkov Размещён: 28.08.2018 01:23
32x32