Python - зачем использовать что-то кроме uuid4 () для уникальных строк? - PullRequest
28 голосов
/ 12 марта 2010

Я вижу, что в нескольких реализациях генерации уникальных строк используются такие вещи, как имена загруженных изображений, идентификаторы сеансов и т. Д., И многие из них используют хеши, такие как SHA1 или другие.

Я не подвергаю сомнению законность использования таких методов, как это, а просто причину. Если я хочу уникальную строку, я просто говорю это:

>>> import uuid
>>> uuid.uuid4()
UUID('07033084-5cfd-4812-90a4-e4d24ffb6e3d')

И я с этим покончил. Я не очень доверял, пока не прочитал uuid, поэтому я сделал это:

>>> import uuid
>>> s = set()
>>> for i in range(5000000):  # That's 5 million!
>>>     s.add(str(uuid.uuid4()))
...
...
>>> len(s)
5000000

Ни одного повторителя (я бы не ожидал, что сейчас он будет учтен, учитывая, что шансы равны 1.108e + 50, но приятно видеть его в действии). Вы могли бы даже половину шансов, просто сделав свою строку, комбинируя 2 uuid4() s.

Итак, с учетом сказанного, почему люди тратят время на random () и другие вещи для уникальных строк и т. Д.? Есть ли важная проблема безопасности или другая, связанная с uuid?

Ответы [ 6 ]

20 голосов
/ 11 сентября 2012

Использование хеша для уникальной идентификации ресурса позволяет генерировать «уникальную» ссылку из объекта. Например, Git использует хеширование SHA для создания уникального хеша, который представляет точный набор изменений отдельного коммита. Поскольку хеширование является детерминированным, вы будете каждый раз получать один и тот же хеш для одного и того же файла.

Два человека по всему миру могут внести одно и то же изменение в один и тот же репо независимо, и Git будет знать, что они сделали одно и то же изменение. UUID v1, v2 и v4 не могут это поддерживать, поскольку они не имеют отношения к файлу или его содержимому.

12 голосов
/ 12 марта 2010

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

5 голосов
/ 12 марта 2010

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

3 голосов
/ 12 марта 2010

uuids длинные и бессмысленные (например, если вы заказываете uuid, вы получаете бессмысленный результат).

И, поскольку он слишком длинный, я бы не хотел помещать его в URL-адрес или предоставлять его пользователю в любой форме.

1 голос
/ 01 февраля 2016

Также обратите внимание, что другие виды UUID могут быть даже подходящими. Например, если вы хотите, чтобы ваш идентификатор можно было заказать, UUID1 частично основан на отметке времени. Все дело в требованиях вашего приложения ...

1 голос
/ 25 октября 2014

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

...