100 процентный, уникальный uuid в Python
Мне нужно сохранять много файлов на сервере и имена для этих файлов выбираются рандомно. Нашёл пост на stack overflow, в котором предлагают для такой задачи использовать uuid4. По определению в документации это совершено случайный UUID, т.е. чисто теоретически в течение большого количества времени, когда звёзды сойдутся, а венера зайдёт в третий круг, значение может повториться. Очень бы не хотелось, чтобы оно повторилось и какой-либо файл был перезаписан. Я конечно разделяю файлы по папкам по году, месяцу и дню, но всё же. Хочу использовать uuid1. В документации говорится, что он генерируется из идентификатора хоста, порядкового номера и текущего времени.
Вопрос: Возможно ли при такой конфигурации получить одинаковое значение? Не понятно, что понимается под текущем временем (с какой точностью берётся время?) и под порядковым номером. Это порядковый номер в цикле? В скрипте? Где? Если я перезапущу сервер, порядковый номер сбросится?
Ответы (1 шт):
Уникальность не гарантируется.
Текущее время согласно спецификации берется с точностью до 100-наносекунд:
The timestamp is a 60-bit value. For UUID version 1, this is represented by Coordinated Universal Time (UTC) as a count of 100- nanosecond intervals since 00:00:00.00, 15 October 1582 (the date of Gregorian reform to the Christian calendar).
Порядковый номер по задумке авторов RFC - это способ бороться с дубликатами, которые могут возникнуть в результате перевода времени назад. Задумка была, чтобы при каждом переводе времени назад (или при перезагрузке, когда перевод мог случится когда ОС об этом не знала) увеличивать этот номер на 1. Но создатели стандартной библиотеки питона пошли своим путем. Порядковый номер можно самому передать в параметре clock_seq в вызов uuid1, а если не передать, то он генерируется случайно и при длине номера в 14 бит имеем всего 2^14 вариантов.