tg-me.com/iosdev/539
Last Update:
Знаете ли вы, что такое 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️⃣ Версия 1. На основе времени + уникальный или случайный идентификатор хоста
2️⃣ Версия 2 (безопасность распределенной вычислительной среды) — менее распространена, чем первая, юзает некий специальный идентификатор, уникальный для системы.
3️⃣ Версия 3. На основе имени + хэш MD5.
4️⃣ Версия 4. PRNG (аббревиатура pseudo-random number generator). Использует большинство современных языков программирования.
5️⃣ На основе имени + хэш SHA-1.
По традиции для расширения кругозора можно прочесть следующее
📖 Документация Apple
📖 How To Generate a Random Unique Identifier
📖 Understanding How UUIDs Are Generated
📖 RFC 4122
@iOS Dev — есть вероятность, что посты отсюда вы ещё где-то увидите 😁
BY iOS Dev
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/iosdev/539