Skip to content

Версии GUID: разбираем v1–v7 и какую выбрать

2026-07-09

Теги: Windows · GUID · Руководство · QuickGUID


Откройте любую библиотеку UUID — и вы увидите uuid1(), uuid3(), uuid4(), uuid5() и всё чаще uuid7(). Спецификация определяет восемь версий. Какую из них использовать на самом деле?

Короткий ответ: v4 для почти всего, v7 для первичных ключей баз данных, v5 когда нужно, чтобы одинаковый вход всегда давал одинаковый GUID. Остальная часть статьи объясняет почему — с раскладками байтов, настоящими причинами каждой версии и шпаргалкой по коду для разных языков.

Если вы новичок в GUID, начните с Что такое GUID? для основ структуры и уникальности. Этот пост — технический спутник, он разбирает каждую версию глубже.

Ландшафт версий GUID/UUID

Каждая версия — это отдельный рецепт заполнения одних и тех же 128 бит. Ниббл версии (первая шестнадцатеричная цифра третьего сегмента) говорит, какой рецепт использовали.

ВерсияИсточник генерацииСортируемаяТипичное применение
v1Время + MACДаУнаследованные системы (риск приватности)
v2DCE SecurityДаРедко, специализированно
v3MD5-хеш пространства имёнНетУстарела (используйте v5)
v4СлучайнаяНетСтандарт по умолчанию
v5SHA-1-хеш пространства имёнНетДетерминированные ID
v6Переупорядоченное время v1ДаПрямая замена v1
v7Метка времени в миллисекундахДаПервичные ключи БД
v8Определяется поставщикомСвойСпециализированно

Версии v1, v4, v5 и v7 покрывают 99 % реального использования. Пройдёмся по каждой.

v1: Время и MAC-адрес

v1 — это исходный рецепт из RFC 4122. Он упаковывает три вещи в 128 бит:

| time_low (32) | time_mid (16) | ver+time_hi (16) | var+clk_seq (16) | node/MAC (48) |
  • 60-битная метка времени — интервалы по 100 наносекунд с 15.10.1582 (дата принятия григорианского календаря). Метка времени разбита по time_low, time_mid и time_hi.
  • 14-битная последовательность часов — счётчик, различающий два GUID, сгенерированные в одном тике часов, или когда системные часы перевели назад.
  • 48-битный узел — MAC-адрес сетевой карты.

Проблема MAC-адреса

Поле узла — это аппаратный отпечаток. Любой опубликованный v1-GUID несёт MAC-адрес вашей машины — и в отличие от IP-адреса, MAC-адрес задуман как глобально уникальный и постоянный. Это реальная утечка приватности.

Это не теория. Исследователи показали, что документы можно отследить до машины, которая их создала, просто прочитав v1-GUID, встроенные в метаданные файла. Сама Microsoft убрала генерацию v1 из телеметрии Office после того, как это продемонстрировали. Современные ОС по той же причине рандомизируют MAC-адрес, показываемый сетям Wi-Fi.

Вердикт: избегайте v1 в новом коде. Он выживает в унаследованных системах, COM-интерфейсах и некоторых аппаратно-смежных инструментах — но нет причин генерировать его самому сегодня.

v2: DCE Security

v2 — это версия, с которой вы по сути никогда не столкнётесь. Она берёт раскладку v1 (метка времени + MAC) и накладывает поверх неё POSIX UID/GID — локальные идентификаторы пользователя и группы из модели безопасности DCE (Distributed Computing Environment), — чтобы UUID мог нести информацию контроля доступа вдобавок к уникальности.

v2 существует для аутентификации DCE/RPC и ACL в унаследованных корпоративных системах. Если только вы не поддерживаете ПО, явно говорящее на DCE Security, вы никогда не сгенерируете и не потребите v2. Он здесь исключительно для полноты списка версий — чтобы вы не гадали, что значит «2» в этом ниббле, если однажды её встретите.

v3: Почему её списали

v3 идентична v5, кроме того, что использует MD5 вместо SHA-1. У MD5 есть практические атаки на коллизии — два разных входа можно так подобрать, чтобы они давали один хеш. Это ломает гарантию детерминизма v3 в условиях активного противника.

RFC 4122 сохранил v3 для обратной совместимости, но v5 её заменил. Нет причин генерировать v3 сегодня. Если встретите v3 в дикой природе, считайте его унаследованным.

v4: Случайный стандарт

v4 — это то, что вы получаете практически от каждого вызова «сгенерировать GUID»: [guid]::NewGuid(), Guid.NewGuid(), crypto.randomUUID(), uuid.uuid4(), NEWID(). Он заполняет 122 из 128 бит криптографически стойкой случайностью (остальные 6 бит — маркеры версии и варианта).

Никакой метки времени, никакого MAC, никакого состояния машины — чистая случайность. Это делает v4 безопасным для раскрытия, тривиально параллелизуемым и достаточно устойчивым к коллизиям для любой реалистичной нагрузки. Полную математику коллизий (и почему вирусное заявление «миллиард лет» неверно понимает парадокс дней рождения) см. в основной статье.

Вердикт: это ваш стандарт. Выбирайте v4, если только у вас нет конкретной причины выбрать что-то другое.

v5: Детерминированные ID пространства имён

Это та версия, о которой большинство разработчиков слышало, но никогда не использовало по-настоящему — а она решает вполне полезную задачу.

v5 позволяет получить тот же GUID из того же входа каждый раз. Дайте ему UUID пространства имён и строку имени — и он вернёт детерминированный идентификатор:

python
import uuid

# Одинаковый вход → одинаковый GUID, при каждом запуске, на любой машине
dns_guid = uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com')
url_guid = uuid.uuid5(uuid.NAMESPACE_URL, 'https://prunelab.net/blog/guid-explained')

print(dns_guid)  # всегда  cf14e0a3-... (то же значение)
print(dns_guid == uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com'))  # True

Как это работает

Внутренне v5 конкатенирует байты UUID пространства имён с UTF-8-байтами имени, прогоняет результат через SHA-1, берёт первые 16 байт, а затем ставит биты версии (5) и варианта. Само пространство имён — это UUID; NAMESPACE_DNS, NAMESPACE_URL, NAMESPACE_OID и NAMESPACE_X500 предопределены, но можно использовать любой UUID как пространство имён.

Когда v5 — правильный инструмент

  • Воспроизводимые тестовые фикстуры — генерируйте ID для тестовых данных, которые остаются стабильными между прогонами, чтобы падающий тест каждый раз указывал на одну и ту же сущность.
  • Идентификаторы, производные от URL — превратите URL в GUID без обращения к базе. Две системы, независимо вычисляющие uuid5(NAMESPACE_URL, url) для одного URL, всегда сойдутся.
  • Идемпотентная дедупликация — импортируйте одну запись дважды, и GUID столкнётся сам с собой, так что дубликат определяется только по ключу.

Ключевой контраст с v4: v4 возвращает уникальное значение на каждый вызов (даже для одинаковых входов); v5 возвращает стабильное значение для одинаковых входов. Они не взаимозаменяемы.

Вердикт: обращайтесь к v5 всякий раз, когда вам нужен GUID, который воспроизводимо выводится из некоторой входной строки.

v6: Починка v1, которая вам, скорее всего, не нужна

v6 содержит ровно те же данные, что v1 — ту же метку времени, ту же последовательность часов и MAC, — но переупорядочивает биты метки времени так, чтобы значение естественным образом сортировалось в хронологическом порядке. В v1 метка времени неудобно разбита (low, mid, high); в v6 она хранится high-first, поэтому лексикографическая сортировка строк равна сортировке по времени.

v6 был стандартизирован в 2024 году в RFC 9562 вместе с v7. Он существует в основном как прямой путь миграции для систем, уже привязанных к модели часы-и-MAC у v1: вы сохраняете существующую логику метки времени и просто переписываете раскладку битов.

Для новых систем v7 почти всегда лучший выбор. v7 использует метку времени в миллисекундах (проще, чем григорианский 100-нс отсчёт v1/v6), не встраивает MAC-адрес и имеет более чистое случайное заполнение. v6 отвечает на «как модернизировать v1, не меняя модель генерации»; v7 отвечает на «что использовать дальше».

v7: Упорядоченный по времени для баз данных

v7 — самое важное добавление со времён v4. Он решает проблему, которую v4 создаёт в базах данных.

Проблема v4 в базе данных

Когда база данных использует GUID как первичный ключ, этот ключ поддерживает индекс на B+-дереве. B+-деревья остаются эффективными, когда вставки примерно упорядочены — новые значения попадают на правый край и заполняют существующие страницы. Случайные v4-GUID разбросаны по всему пространству ключей, поэтому каждая вставка бьёт по случайной странице. На больших таблицах это вызывает постоянные расщепления страниц, фрагментацию индекса, трэш кэша и усиление записи. Починка в SQL Server (NEWSEQUENTIALID()) — проприетарный, непереносимый хак, который течёт последовательностью.

Раскладка v7

| unix_ts_ms (48) | ver (4) | rand_a (12) | var (2) | rand_b (62) |
  • 48-битная Unix-метка в миллисекундах — ведущее поле, поэтому значения растут со временем.
  • 4-битная версия — установлена в 7.
  • 12-бит rand_a — случайно, либо опционально монотонный счётчик для упорядочивания в пределах одной миллисекунды.
  • 2-битный вариант — стандартный маркер RFC 9562.
  • 62-бит rand_b — случайно.

Поскольку метка времени идёт первой, v7-GUID, сгенерированные последовательно, естественным образом упорядочены: вставки в индекс скапливаются на правом краю, страницы заполняются чисто, а B+-дерево ведёт себя как с автоинкрементным целым — оставаясь при этом глобально уникальным без центрального координатора.

Когда v7 НЕ стоит того

  • Хранилища в памяти (Redis, memcached) — нет B+-дерева, нет стоимости фрагментации. v4 подойдёт.
  • Маленькие таблицы — разница между v4 и v7 незаметна ниже миллионов строк.
  • Неключевые столбцы — если GUID просто хранимый атрибут, а не ключ индекса, порядок не важен.
  • GUID, которые должны быть непрозрачными — v7 течёт миллисекундой генерации, что может быть нежелательно в контекстах, чувствительных к безопасности.

Вердикт: если GUID — кластеризованный первичный ключ в настоящей базе данных, используйте v7. В остальных случаях v4.

v8: Определяется поставщиком

v8 — это запасной выход: RFC 9562 позволяет поставщику определять собственную раскладку битов, лишь бы ниббл версии содержал 8, а биты варианта были корректны. Всё остальное — ширина метки времени, источник случайности, кодировка — на усмотрение разработчика.

v8 вы встретите лишь в системах, спроектировавших собственную схему UUID по конкретной причине (например, чтобы встроить shard ID или node ID в UUID для маршрутизации). Если вы не строите такую систему, v8 не имеет значения; а если строите, правила диктует ваша собственная схема, а не что-либо в этой статье.

Какую версию вам стоит использовать на самом деле?

Путеводитель по решению:

  • «Генерирую ID для общего использования?»v4. Это ответ в 90 % случаев.
  • «Первичный ключ БД или нужно упорядочивание по времени?»v7. Особенно для кластеризованных индексов на больших таблицах.
  • «Нужен один и тот же GUID для одного и того же входа каждый раз?»v5. Детерминированное отображение из строки.
  • «Работаю с унаследованной системой, ожидающей v1?»v1 (сохраните совместимость), но планируйте миграцию на v7.
  • «Кто-то посоветовал v3?» → Не надо. Используйте v5 вместо неё (MD5 в v3 сломан).
  • «Я хочу самое новое.» → Это не причина. v7 — новое и решает реальную проблему (порядок в БД); v6 — новое и в основном подспорье для миграции с v1. Выбирайте по сценарию, а не по новизне.

Если всё ещё сомневаетесь — берите v4. Стандарт по умолчанию существует не просто так.

Генерация GUID по версии и языку

Язык / инструментv4 (по умолчанию)v5 (детерминированный)v7 (упорядоченный)
PowerShell[guid]::NewGuid()
C# / .NETGuid.NewGuid()Guid.CreateVersion7() (.NET 9+)
Pythonuuid.uuid4()uuid.uuid5(uuid.NAMESPACE_URL, 'name')uuid.uuid7() (3.14 beta) / библиотека
JavaScriptcrypto.randomUUID()(npm uuid v11+)
Node.js (библ. uuid)uuid.v4()uuid.v5('name', NAMESPACE)uuid.v7()
SQL ServerNEWID()
PostgreSQLgen_random_uuid()(расширение)

Несколько замечаний: нативная поддержка v7 в 2026 году всё ещё встраивается в стандартные библиотеки. Пакет uuid для Node.js (v11+) и .NET 9 поставляют её нативно; Python добавляет uuid.uuid7() в 3.14; более старым рантаймам нужна библиотека. Поддержка v5 почти повсеместна, потому что это чистая SHA-1-математика без требования источника энтропии.

Часто задаваемые вопросы

Заменит ли v7 v4 в качестве стандарта?

Нет. v4 остаётся общим стандартом. v7 выигрывает только когда GUID — упорядоченный первичный ключ; для большинства остальных применений (сессионные токены, ID запросов, хеши контента, всё не-БД) случайность v4 не недостаток, а ведущая метка времени v7 лишь утекала бы информацией о тайминге без пользы.

Безопасно ли ещё использовать v1?

Нет. v1 встраивает MAC-адрес вашей сетевой карты — постоянный аппаратный отпечаток. Сама Microsoft убрала v1 из телеметрии Office после того, как исследователи отследили машины по документам через встроенные GUID. Для нового кода избегайте v1 целиком; для унаследованного v1 планируйте миграцию на v7.

В чём разница между v3 и v5?

Оба — детерминированные хеши пространства имён (одинаковый вход → одинаковый GUID). v3 использует MD5, v5 использует SHA-1. У MD5 есть практические атаки на коллизии, поэтому v3 считается сломанным для целей целостности и был заменён на v5. Нет причин генерировать v3 сегодня.

Могу ли я преобразовать v4-GUID в v7?

Нет. Версия — это не ярлык, который можно переставить; каждая версия использует совершенно разную логику генерации. У v4 нет метки времени для извлечения, поэтому единственный способ «получить v7» — сгенерировать новый. Если нужно мигрировать столбец первичного ключа с v4 на v7, вы фактически добавляете новый столбец и переписываете его.

Поддерживает ли .NET v7 нативно?

Да. Guid.CreateVersion7() был добавлен в .NET 9 (выпущен в ноябре 2024 года). Если вы на .NET 8 или старше, используйте пакеты NuGet GenVault или UUIDv7, либо обновитесь.

QuickGUID: генерация v4 и v7, конвертация любого формата

Для повседневной работы с GUID QuickGUID — нативный набор инструментов Windows, покрывающий весь процесс:

  • Пакетная генерация v4 или v7, до 1 000 за раз
  • Конвертация 10+ форматов: стандартный, без дефисов, в фигурных скобках, Base64, массив байт C, макрос DEFINE_GUID — всё с живым предпросмотром
  • Умная экстракция: вставьте логи или исходный код, автоматически найдите и преобразуйте каждый GUID
  • Живые декораторы: кавычки, префиксы/суффиксы, регистр — переключаются глобально и копируются напрямую

Полностью бесплатно, 100% офлайн.

В заключение

Система версий существует потому, что разные задачи требуют разных гарантий: v4 даёт неотслеживаемую случайность, v5 даёт воспроизводимость, v7 даёт упорядоченность. По умолчанию v4, обращайтесь к v7 на ключах БД и используйте v5, когда одинаковые входы должны давать одинаковые GUID.

Новичок в GUID? Начните с Что такое GUID? — там основы структуры, формат с дефисами и почему 128 бит достаточно, чтобы коллизии на практике перестали быть проблемой.