2022-08-17 14:18:53
Знаете ли вы, что такое UUID на самом деле или при чём тут RFC 4122?В документации Apple сказано, что UUID это
универсальное уникальное значение для идентификации типов, интерфейсов и других элементов. Но что, если я скажу вам, что оно не такое уж уникальное?
Шанс сгенерировать один и тот же идентификатор
дважды на любом устройстве планеты
практически равен нулю! Ключевое слово здесь —
практически, и ниже я попытаюсь рассказать, почему.
В Swift мы можем создать UUID довольно просто:
let identifier = UUID()
print(identifier)
Результатом будут 128
случайно сгенерированных битов (если вы хотите вывести значение строки, то можно использовать identifier.uuidString).
Но так ли они случайны? Для этого мы можем обратиться
к стандарту RFC 4122, который содержит целых
5 различных подходов к созданию этих идентификаторов.
UUID — это просто 128-битные числа, используемые для уникальной идентификации элементов при разработке ПО. Их каноническое текстовое представление это
пять групп шестнадцатеричных символов, разделённых дефисами:
8-4-4-4-12.
Что-то вроде: 3422b448-2460-4fd2-9183-8000de6f8343 (подозреваю, что вы где-то такое
уже видели).
В эту, на первый взгляд, случайную серию шестнадцатеричных символов
встроена информация о реализации UUID.
xxxxxxxx-xxxx-
Mxxx-
Nxxx-xxxxxxxxxxxx
Значения на позициях M и N
однозначно определяют версию и вариант UUID.
ВерсияНомер версии идентифицируется путем просмотра старших 4 битов значения в позиции M
ВариантПоле варианта определяет расположение информации, встроенной в UUID. Интерпретация всех остальных битов в UUID зависит от значения варианта.
В iOS нас больше всего интересует RFC 2144 версии 4Более ранние версии универсальных уникальных идентификаторов полагались на дату и время, MAC-адрес устройства и идентификаторы namespace (можно прочесть ниже).Всякий раз, когда структура UUID генерирует новый идентификатор, она в основном делает
122 броска кубика (или костей ), чтобы получить
122 случайных бита. Остальные ведь нужны нам для идентификации версии и варианта, помните?
Немного математики говорит нам, что всего у нас
3 ундециллиона идентификаторов, или 5,3 триллионов триллионов триллионов (ладно, чтобы было проще 5.3 и 36 нулей). ЭТО МНОГО!
Количество идентификаторов, которые необходимо сгенерировать, чтобы иметь 50-процентную вероятность коллизии (т. е. два одинаковых идентификатора), составляет 2,71 квинтиллиона, или 2,71 в 1018 степени. А я говорил, что они не на 100% уникальны!
На это потребуется 85 лет, если вы будете генерировать 1 миллиард идентификаторов в секунду.
Внимание, спойлер финальной серии сериала «Лучше звоните Солу»! Почти столько же, сколько дали Солу, чёрт возьми!
Чтобы сохранить все эти идентификаторы, вы должны создать файл размером около 45 экзабайт или 45 миллионов терабайт, что намного больше, чем самые большие БД в мире.
UUID является универсально уникальным для всех устройств, баз данных, iPhone и т. д. в мире.
Вероятность создания одного и того же UUID дважды ничтожно мала (но есть).
Остальные версии UUID Версия 1. На основе времени + уникальный или случайный идентификатор хоста
Версия 2 (безопасность распределенной вычислительной среды) — менее распространена, чем первая, юзает некий специальный идентификатор, уникальный для системы.
Версия 3. На основе имени + хэш MD5.
Версия 4. PRNG (аббревиатура pseudo-random number generator). Использует большинство современных языков программирования.
На основе имени + хэш SHA-1.
По традиции для расширения кругозора можно прочесть следующее Документация Apple
How To Generate a Random Unique Identifier
Understanding How UUIDs Are Generated
RFC 4122
@iOS Dev — вот этот канал точно уникален на 100% (но есть ничтожная вероятность, что посты отсюда
вы ещё где-то увидите )
1.8K viewsedited 11:18