Нужно ли использовать всю строку UUID, чтобы гарантировать уникальность? - PullRequest
0 голосов
/ 02 апреля 2020

Я использую библиотеку UUID в Python для генерации уникальных идентификаторов объекта. Более конкретно, я в основном делаю

id_for_something = uuid.uuid4().hex

Мой вопрос заключается в том, должен ли я использовать целое шестнадцатеричное строковое значение, чтобы гарантировать, что идентификаторы будут уникальными? Или можно использовать, например, первые 4 цифры? Я просто спрашиваю, потому что использование всей строки кажется немного длинным. Спасибо!

1 Ответ

5 голосов
/ 02 апреля 2020

UUID никогда гарантированно не будут уникальными. Например, если вы сгенерировали 2.7 * 10 ^ 18 UUID4, то у вас есть 50% шанс на создание коллизии ( см. Вики ). Но это число огромно, поэтому мы редко заботимся об этом. Это, конечно, при условии, что базовый генератор случайных чисел достаточно хорош.

Однако, если вы сократите UUID, то вы существенно увеличите эту вероятность. Для UUID длиной 4 байта (назовем его SHORTUUID) у вас есть 16 ^ 4 комбинаций, что подразумевает (из-за парадокс дня рождения ), что после генерации ~ 65k таких SHORTUUID у вас будет более 50% вероятности столкновения ( см. и обратите внимание, что 4-байтовый UUID совпадает с 32-разрядным целым числом). Это число низкое, как жалко низкое. И на самом деле все становится еще хуже, поскольку не весь UUID4 является случайным.

Так что, если вам небезразличны коллизии, не делайте этого.

Если вы хотите сократить UUID, то я советую использовать base64-кодировку вместо hex.

...