Что такое GUID? — Структура, версии и уникальность простым языком
2026-05-24
Теги: Windows · GUID · Руководство · QuickGUID
Если вы занимались разработкой на Windows, вы наверняка его видели — строку из шестнадцатеричных символов, похожую на бессмысленный набор символов:
6B29FC40-CA47-1067-B31D-00DD010662DAОна может встретиться в реестре, в файлах конфигурации, в логах или посреди какого-нибудь сообщения об ошибке. Вы знаете, что это называется GUID, и знаете, что он «должен быть уникальным», но, скорее всего, никогда всерьёз не задумывались — что именно представляет собой эта строка? Почему она выглядит именно так? Как она гарантирует, что не повторится?
Давайте разберёмся.
UUID и GUID: два названия одной сущности
Начнём с факта, о котором многие не знают: GUID и UUID — это одно и то же.
- UUID (Universally Unique Identifier, Универсальный Уникальный Идентификатор) — официальное название, определённое в RFC 4122.
- GUID (Globally Unique Identifier, Глобальный Уникальный Идентификатор) — имя, которое дала ему Microsoft.
Вот и всё. UUID — официальное название стандарта, GUID — псевдоним, который Microsoft использует в COM, Windows API, .NET и других технологиях. GUID, который вы видите на Windows, и UUID, который вы видите на Linux, — по сути одно и то же.
Для единообразия далее в этой статье мы будем в основном использовать название GUID — в конце концов, речь идёт о разработке под Windows.
Структура GUID: выглядит хаотично, но логика есть
Стандартный GUID выглядит так:
6B29FC40-CA47-1067-B31D-00DD010662DAФормат 8-4-4-4-12, всего 32 шестнадцатеричных символа (128 бит), разделённых дефисами на 5 блоков. Выглядит случайно, но имеет внутреннюю структуру:
6B29FC40-CA47-1067-B31D-00DD010662DA
↑ ↑
версия вариантКлюч к разгадке — в первом символе третьего блока и первом символе четвёртого блока:
- Версия (Version): Первая шестнадцатеричная цифра третьего блока указывает, какой алгоритм использовался для генерации GUID.
1означает v1,4— v4,7— v7. - Вариант (Variant): Первая шестнадцатеричная цифра четвёртого блока указывает, какой стандартной спецификации следует GUID. Значения
8,9,A,Bозначают соответствие RFC 4122 — подавляющее большинство GUID, с которыми вы сталкиваетесь, используют именно этот вариант.
Так что в следующий раз, когда увидите GUID, просто бросьте взгляд на первый символ третьего блока — и вы сразу поймёте, v1 это, v4 или v7. Это гораздо полезнее, чем просто смотреть на него без понимания.
Какие версии GUID существуют?
Спецификация UUID определяет несколько версий, но на практике используются в основном три:
v1: На основе времени и MAC-адреса
GUID v1 генерируется комбинированием текущей метки времени (с точностью до 100 наносекунд) и MAC-адреса сетевой карты.
Преимущество: естественная упорядоченность, следует хронологии генерации. Недостаток: раскрывает время создания, а MAC-адрес — это аппаратная информация, что создаёт серьёзные проблемы с приватностью и безопасностью. Злоумышленник, получивший GUID v1, может восстановить MAC-адрес вашего устройства и точное время генерации.
Поэтому сегодня v1 почти никто не использует, хотя в старых системах его всё ещё можно встретить.
v4: Чистая случайность
v4 — самая распространённая версия на сегодняшний день. За исключением битов версии и варианта, которые фиксированы, остальные 122 бита полностью заполняются случайными числами.
Никаких меток времени, никакой аппаратной информации — только случайность гарантирует уникальность. Просто и грубо, но невероятно эффективно.
Когда вы вызываете в своём коде new Guid(), uuid.uuid4() или crypto.randomUUID(), почти всегда получается именно v4.
v7: Новая звезда с временной сортировкой
v7 — версия, которая была официально включена в стандарт только в 2024 году. Она отводит первые 48 бит под метку времени в миллисекундах, а остальные заполняет случайными числами.
Зачем понадобился v7? Потому что v4, при всех его достоинствах, полностью случаен и не может быть отсортирован по времени. Для баз данных это проблема:
- Когда GUID используется как первичный ключ и применяется версия v4, порядок вставки не совпадает с порядком индекса, что приводит к частым разбиениям B+-дерева и снижению производительности записи.
- v7, благодаря тому что первая часть — это метка времени, естественно возрастает во времени, порядок вставки и порядок индекса практически совпадают, и производительность записи значительно выше.
Так что если ваш проект использует GUID в качестве первичного ключа базы данных, v7 — лучший выбор, чем v4.
«GUID не повторится» — но тот мем из интернета ошибается
Каждый раз, когда заходит речь об уникальности GUID, кто-нибудь спрашивает: а что, если он повторится?
В интернете гуляет утверждение: «Вероятность коллизии v4 GUID настолько мала, что даже при генерации 1 миллиарда в секунду на протяжении 1 миллиарда лет повтора не будет.» Звучит успокаивающе, правда?
Но математически это утверждение неверно.
В чём ошибка? Парадокс дней рождения
Оно попадает в классическую ловушку интуиции — парадокс дней рождения.
Возможно, вы знакомы с этой задачей: сколько людей должно быть в комнате, чтобы вероятность того, что «у двух из них совпадут дни рождения», превысила 50%? Интуиция подсказывает: в году 365 дней, значит, нужно около 180 человек, верно?
На самом деле достаточно всего 23 человек.
Причина в том, что мы проверяем не «совпадёт ли день рождения конкретного человека с конкретной датой», а «найдётся ли среди всех людей хотя бы одна пара с совпадающим днём рождения». С ростом числа людей количество возможных пар растёт очень быстро.
С GUID та же история. Мы проверяем не «может ли конкретный GUID совпасть с другим конкретным», а «среди всех сгенерированных GUID найдётся ли хотя бы одна совпадающая пара». Количество комбинаций растёт квадратично от общего числа — гораздо быстрее, чем подсказывает интуиция.
Реальная шкала времени коллизий
Если генерировать строго 1 миллиард GUID в секунду, без остановки, и пересчитать по формуле парадокса дней рождения:
- 10 лет: вероятность коллизии примерно 1%
- 33 года: вероятность коллизии примерно 10%
- 86 лет: вероятность коллизии примерно 50%
А 1 миллиард лет? К тому моменту количество коллизий уже было бы неисчислимым.
Так можно ли не беспокоиться?
Безусловно. Вышеописанный сценарий предполагает «1 миллиард в секунду, без остановки» — в реальности ни одно приложение не достигает такого объёма.
Если за всё время жизни вашей системы вы сгенерируете в общей сложности 100 триллионов GUID (что само по себе астрономически завышенная цифра), вероятность коллизии составит всего 1 на миллиард.
Можно смело использовать.
Повседневные сложности при работе с GUID
Разобравшись с теорией, вернёмся к практике. Настоящая боль разработчиков при работе с GUID — вовсе не «а вдруг повторится», а совсем другое:
Неудобная генерация
Встроенный в Windows guidgen.exe генерирует только по одному GUID за раз. В терминале? PowerShell может: [guid]::NewGuid(). Но если вам нужно 50 штук сразу для тестовых данных? Придётся писать скрипт.
Разнобой форматов
Один и тот же GUID может выглядеть совершенно по-разному в зависимости от языка и контекста:
6B29FC40-CA47-1067-B31D-00DD010662DA // Стандартный формат
6B29FC40CA471067B31D00DD010662DA // Без дефисов
{6B29FC40-CA47-1067-B31D-00DD010662DA} // В фигурных скобках (C#/COM)
urn:uuid:6B29FC40-CA47-1067-B31D-00DD010662DA // URN
aKXwnELGRYeysdADQClibto= // Base64Скопировали GUID из лога и нужно преобразовать в формат макроса DEFINE_GUID для кода на C? Править вручную.
Утомительное извлечение
В лог-файле разбросаны десятки GUID, и нужно их все найти? Сканировать глазами или писать регулярное выражение?
[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}Работает, но каждый раз приходится гуглить, чтобы написать правильно.
Решите все эти проблемы с QuickGUID
Все эти неудобства можно решить одним инструментом. QuickGUID — это нативный набор инструментов GUID для Windows:
- Пакетная генерация v4 или v7, до 1 000 штук за раз
- Более 10 форматов с конвертацией в реальном времени: стандартный, без дефисов, в фигурных скобках, Base64, байтовый массив C, макрос
DEFINE_GUID... всё с мгновенным предпросмотром - Умное извлечение: вставьте лог или исходный код — инструмент автоматически найдёт все GUID и преобразует их в пакетном режиме
- Декоратор в реальном времени: кавычки, суффиксы, регистр символов — глобальное переключение, результат сразу готов к копированию
Полностью бесплатно, 100% оффлайн.
Заключение
GUID — одна из самых незаметных, но при этом самых надёжных инфраструктурных составляющих разработки ПО. Всего 128 бит, без центральной координации, без подключения к сети — и при этом глобальная уникальность гарантирована. Этот дизайн существует уже более 30 лет и остаётся одной из лучших практик использования идентификаторов в распределённых системах.
Надеюсь, эта статья помогла вам разобраться в «почему» за кулисами GUID.