Skip to content

Что такое 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, и нужно их все найти? Сканировать глазами или писать регулярное выражение?

regex
[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.