Функция uuid4
возвращает UUID, созданный из 16 случайных байтов, и крайне вряд ли приведет к коллизии, до такой степени, что вы, вероятно, даже не должны об этом беспокоиться.
Если по какой-то причине uuid4
создает дубликат, то это скорее всего ошибка программирования, например, ошибка при правильной инициализации генератора случайных чисел, чем настоящая неудача.В этом случае подход, который вы используете, не сделает его еще лучше - неправильно инициализированный генератор случайных чисел все еще может создавать дубликаты даже при вашем подходе.
Если вы используете реализацию по умолчанию random.seed(None)
вы можете видеть в источнике , что только 16 байтов случайности используются для инициализации генератора случайных чисел, поэтому эту проблему вам придется решить в первую очередь.Кроме того, если ОС не обеспечивает источник случайности, будет использоваться системное время, которое совсем не случайно.
Но игнорируя эти практические вопросы, вы в основном идете по правильному пути.Чтобы использовать математический подход, мы сначала должны определить, что вы подразумеваете под «уникальностью».Я думаю, что разумное определение - это количество идентификаторов, которые вам нужно сгенерировать, прежде чем вероятность создания дубликата превысит некоторую вероятность p
.Примерная формула для этого:
, где d
равно 2**(16*8)
для одного случайно сгенерированного uuid и 2**(16*2*8)
с вашим предлагаемым подходом.Квадратный корень в формуле действительно обусловлен парадоксом дня рождения .Но если вы решите это, вы увидите, что если вы возводите в квадрат диапазон значений d
, сохраняя p
постоянным, то вы также возводите в квадрат n
.