Генератор UUID · форматUUID v1 — генератор и как он устроен
Первая версия — время с точностью до 100 наносекунд от 15 октября 1582 года плюс узел: исторически MAC-адрес сетевой карты. Время разрезано на части и записано младшими битами вперёд, поэтому строки v1, вопреки распространённому мнению, по времени не сортируются.
Совместимость со старыми системами, которые ждут именно v1.
Новые проекты — нет: для времени внутри берите v7, он сортируется и не раскрывает машину.
Если нужен v1-совместимый формат с сортировкой — это v6, а не v1.
Чем отличается от соседей
Против v7: v1 точнее по времени, но его строки не упорядочены, а узел исторически раскрывал MAC-адрес машины. Против v6: v6 — те же 60 бит времени, переставленные от старших к младшим, поэтому сортируются. Наш генератор ставит случайный узел с multicast-битом, как требует RFC 9562: MAC браузеру недоступен, и выдавать случайные байты за адрес карты было бы неправдой.
Время в v1 — 60 бит в интервалах по 100 наносекунд от 15 октября 1582 года, разрезанные на три части. Их нужно собрать в обратном порядке — сначала третью группу без цифры версии, потом вторую, потом первую — вычесть смещение до 1970 года и перевести в дату. Поле «Проверка» на странице генератора делает это автоматически.
Последние двенадцать цифр — поле узла. Исторически это MAC-адрес сетевой карты, но генератор вправе записать туда случайные байты и обязан тогда выставить multicast-бит — младший бит первого октета. Если он стоит, адрес не настоящий. Браузер MAC-адреса не видит вовсе, поэтому здесь узел всегда случайный, и проверка помечает это явно.
Потому что время записано младшими битами вперёд: первая группа — самая быстро меняющаяся часть, она переполняется примерно раз в семь минут. Строки идентификаторов, созданных подряд, при сортировке перемешиваются. Именно это исправляет версия 6 — те же 60 бит времени, переставленные от старших к младшим, — и версия 7 на Unix-времени.
Версия из RFC 9562, придуманная как сортируемая замена v1: то же 60-битное время от 1582 года и тот же узел, но время записано от старших бит к младшим, поэтому строки идут в порядке создания. Её берут, когда нужна совместимость с данными v1. Для новых систем RFC советует v7 — на Unix-времени и без узла.
Он раскрывает момент создания с точностью до 100 наносекунд и, если узел настоящий, — MAC-адрес машины. В 1999 году по такому идентификатору в документах Word связали автора вируса Melissa с его компьютером. Угадать следующий v1 тоже проще, чем случайный. Поэтому для новых проектов его не выбирают, а наружу не показывают.
Шестидесяти бит в интервалах по 100 наносекунд от 15 октября 1582 года хватит до 5236 года. Чаще ломается не время, а уникальность: если за один интервал на машине создают два значения или часы переводят назад, совпадение предотвращает счётчик clock_seq. Генератор без счётчика может выдать дубликат.