Математический вопрос по поводу uuid4 в Python - PullRequest
6 голосов
/ 29 ноября 2010

Я не очень разбираюсь в статистической математике и т. Д. Мне было интересно, если я использую следующее:

import uuid
unique_str = str(uuid.uuid4())
double_str = ''.join([str(uuid.uuid4()), str(uuid.uuid4())])

Является ли double_str строка в квадрате столь же уникальной, как unique_str или просто некоторыесумма более уникальная?Кроме того, есть ли какие-либо негативные последствия в том, чтобы делать что-то вроде этого (например, некоторая проблема с днем ​​рождения и т. Д.)?Это может показаться невежественным, но я бы просто не знал, что моя математика охватывает в лучшем случае алгебру 2.

Ответы [ 3 ]

18 голосов
/ 29 ноября 2010

Функция uuid4 возвращает UUID, созданный из 16 случайных байтов, и крайне вряд ли приведет к коллизии, до такой степени, что вы, вероятно, даже не должны об этом беспокоиться.

Если по какой-то причине uuid4 создает дубликат, то это скорее всего ошибка программирования, например, ошибка при правильной инициализации генератора случайных чисел, чем настоящая неудача.В этом случае подход, который вы используете, не сделает его еще лучше - неправильно инициализированный генератор случайных чисел все еще может создавать дубликаты даже при вашем подходе.

Если вы используете реализацию по умолчанию random.seed(None) вы можете видеть в источнике , что только 16 байтов случайности используются для инициализации генератора случайных чисел, поэтому эту проблему вам придется решить в первую очередь.Кроме того, если ОС не обеспечивает источник случайности, будет использоваться системное время, которое совсем не случайно.

Но игнорируя эти практические вопросы, вы в основном идете по правильному пути.Чтобы использовать математический подход, мы сначала должны определить, что вы подразумеваете под «уникальностью».Я думаю, что разумное определение - это количество идентификаторов, которые вам нужно сгенерировать, прежде чем вероятность создания дубликата превысит некоторую вероятность p.Примерная формула для этого:

alt text

, где d равно 2**(16*8) для одного случайно сгенерированного uuid и 2**(16*2*8) с вашим предлагаемым подходом.Квадратный корень в формуле действительно обусловлен парадоксом дня рождения .Но если вы решите это, вы увидите, что если вы возводите в квадрат диапазон значений d, сохраняя p постоянным, то вы также возводите в квадрат n.

1 голос
/ 29 ноября 2010

Поскольку uuid4 основан на генераторе псевдослучайных чисел, его повторный вызов не приведет к квадрату величины «уникальности» (и даже может вообще не добавить уникальности).

См. Также Когда мне следует использовать uuid.uuid1 () против uuid.uuid4 () в python?

0 голосов
/ 29 ноября 2010

Это зависит от генератора случайных чисел, но это почти квадрат уникальности.

...