2017-01-20 6 views
1

У меня есть модель в Django, которая использует UUID таким образом:Как Django генерирует uuid?

uuid = models.CharField(max_length=100, default=uuid.uuid1) 

Дело в том, когда я создал 2 объекта, один за другим, я получил это:

933e35c4-df1c-11e6-8a53-ace01055799e 

И потом:

933e35c5-df1c-11e6-8a53-ace01055799e 

из того, что я знаю, что каждый UUID генерируется случайным образом, но вероятность столкновения очень мала, то как именно они генерируются, когда я получаю эти 2 UUID, которые являются почти то же самое? (он отличается только последним числом первого блока) и насколько это возможно? Есть ли более безопасный способ сделать это?

Дело в том, что у меня есть набор клиентов, каждый из которых получает уникальный uuid по электронной почте, если они могут просто изменить один символ и перейти на другой uuid клиента, что было бы проблемой.

+0

Он даже говорит, как он сгенерирован в первой строке кода, который вы указали: Использование функции 'uuid.uuid1', код которой присутствует в вашей стандартной библиотеке Python .. – Phillip

ответ

1

Вы используете uuid.uuid1, который, как состояние Документов

Генерировать UUID от идентификатора хоста, порядкового номера, и текущего времени.

Вы должны использовать uuid.uuid4, который генерирует случайное UUID.

1

Для этого используется uuid.uuid1 (это ваше значение по умолчанию). См. docs:

Создайте UUID из идентификатора хоста, порядкового номера и текущего времени. Если узел не указан, getnode() используется для получения аппаратного адреса. Если указано clock_seq, оно используется как порядковый номер; , в противном случае выбирается случайный 14-разрядный порядковый номер.

Существуют и другие алгоритмы, возможно, uuid4 - это то, что вы ищете.