Я написал генератор / парсер UUID для Ruby, поэтому считаю себя достаточно хорошо осведомленным по этому поводу. Существует четыре основных версии UUID:
UUID версии 4 - это, по сути, всего лишь 16 байтов случайности, извлеченные из криптографически безопасного генератора случайных чисел, с некоторым изменением битов для идентификации версии и варианта UUID. Они крайне маловероятны, чтобы столкнуться, но это может произойти, если используется ГПСЧ или если вам просто действительно, очень, очень, очень, очень не повезло.
UUID версии 5 и версии 3 используют хэш-функции SHA1 и MD5 соответственно, чтобы объединить пространство имен с частью уже уникальных данных для генерации UUID. Это, например, позволит вам создать UUID из URL-адреса. Коллизии здесь возможны только в том случае, если основная хеш-функция также имеет коллизию.
UUID версии 1 являются наиболее распространенными. Они используют MAC-адрес сетевой карты (который, если он не подделан, должен быть уникальным), плюс временная метка, а также обычная перестановка битов для генерации UUID. В случае машины, у которой нет MAC-адреса, 6 байтов узла генерируются криптографически безопасным генератором случайных чисел. Если два UUID генерируются последовательно достаточно быстро, чтобы метка времени совпадала с предыдущим UUID, метка времени увеличивается на 1. Коллизии не должны происходить, если не произойдет одно из следующих событий: MAC-адрес подделан; Одна машина, на которой запущены два разных приложения, генерирующих UUID, генерирует UUID в один и тот же момент; Две машины без сетевой карты или без доступа уровня пользователя к MAC-адресу получают одинаковую случайную последовательность узлов и генерируют UUID в один и тот же момент;
На самом деле ни одно из этих событий не происходит случайно в пространстве идентификаторов одного приложения. Если вы не принимаете идентификаторы, скажем, в масштабе всего Интернета или в ненадежной среде, где злоумышленники могут сделать что-то плохое в случае конфликта идентификаторов, вам не о чем беспокоиться. Очень важно понимать, что если вам случится сгенерировать тот же UUID версии 4, что и я, в большинстве случаев это не имеет значения. Я сгенерировал идентификатор в совершенно другом месте, отличном от вашего. Мое приложение никогда не узнает о столкновении, поэтому столкновение не имеет значения. Откровенно говоря, в едином пространстве приложений без злонамеренных субъектов исчезновение всего живого на Земле произойдет задолго до того, как вы столкнетесь, даже с UUID версии 4, даже если вы
Кроме того, 2 ^ 64 * 16 составляет 256 эксабайт. Например, вам нужно будет хранить идентификаторы на 256 экзабайт, прежде чем у вас будет 50% вероятность конфликта идентификаторов в одном пространстве приложения.