Открыть сервис

GUID

GUID (сокращение от англ. Globally Unique Identifier — глобальный уникальный идентификатор) — это 128-битное (16-байтное) целое число, используемое в информатике для однозначной идентификации объектов, сущностей или ресурсов в распределённых компьютерных системах. Основное свойство GUID — практическая уникальность в пространстве и времени, что позволяет создавать идентификаторы без обращения к централизованному координатору. GUID является реализацией стандарта UUID (Universally Unique Identifier), описанного в спецификациях RFC 4122 и ISO/IEC 9834-8:2014.

История

Концепция глобально уникальных идентификаторов возникла в 1980-х годах в корпорации Apollo Computer (США) для операционной системы Domain/OS. Первоначально они назывались UUID и использовались для идентификации объектов в сетевой файловой системе. В 1990-х годах технология была адаптирована Open Software Foundation (OSF) для распределённой вычислительной среды (DCE). В 1997 году спецификация UUID была стандартизирована Internet Engineering Task Force (IETF) в документе RFC 4122.

В экосистеме Microsoft GUID появился в 1995 году с выходом Windows 95 и COM (Component Object Model). Microsoft использовала GUID для идентификации COM-классов, интерфейсов и библиотек типов. Впоследствии GUID стал широко применяться в .NET Framework (структура System.Guid), реестре Windows, базах данных (SQL Server, PostgreSQL) и многих других системах.

Структура и формат

GUID представляет собой 128-битное число, которое обычно записывается в виде 32 шестнадцатеричных цифр, сгруппированных в пять блоков, разделённых дефисами. Канонический формат выглядит так:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Где:

  • x — шестнадцатеричная цифра (0–9, a–f или A–F).
  • Первые 8 цифр (4 байта) — временная метка (в версии 1) или случайное значение (в версии 4).
  • Следующие 4 цифры (2 байта) — временная метка или случайное значение.
  • Третья группа из 4 цифр (2 байта) — содержит номер версии (старшие 4 бита) и часть временной метки или случайного значения.
  • Четвёртая группа из 4 цифр (2 байта) — содержит вариант (старшие 2 бита) и случайные данные.
  • Последние 12 цифр (6 байт) — узел (MAC-адрес) в версии 1 или случайные данные в версии 4.

Пример GUID: 550e8400-e29b-41d4-a716-446655440000

Версии GUID

Согласно RFC 4122, существует несколько версий UUID, которые различаются способом генерации:

ВерсияНазваниеМетод генерацииПрименение
v1Time-basedНа основе текущего времени (100-наносекундные интервалы с 15 октября 1582 года) и MAC-адреса сетевого интерфейсаСистемы, где важна хронологическая упорядоченность
v2DCE SecurityНа основе времени, идентификатора пользователя (UID) и группы (GID)Распределённые вычислительные среды DCE
v3Name-based (MD5)Хеширование MD5 от имени (например, URL) и пространства имёнСоздание детерминированных идентификаторов
v4RandomСлучайные или псевдослучайные числаНаиболее распространённая версия; используется в большинстве современных приложений
v5Name-based (SHA-1)Хеширование SHA-1 от имени и пространства имёнАналог v3, но с более стойким хешированием

Варианты

Старшие биты четвёртой группы определяют вариант (variant) GUID:

  • Variant 1 (10xx) — стандарт RFC 4122/DCE 1.1. Используется в подавляющем большинстве современных реализаций.
  • Variant 2 (110x) — резерв для Microsoft COM/DCOM.
  • Variant 3 (111x) — резерв для будущих расширений.
  • Variant 0 (0xxx) — устаревший формат NCS (Apollo Computer).

Свойства и характеристики

Уникальность

Вероятность коллизии (совпадения двух случайно сгенерированных GUID версии 4) оценивается как 1 на 5,3×10³⁶ для генерации 1 миллиарда идентификаторов в год. На практике это значение считается пренебрежимо малым для любых реальных систем. Для версии 1 уникальность гарантируется комбинацией времени и MAC-адреса (при условии, что часы не сбрасываются и MAC-адрес уникален).

Размер

GUID занимает 16 байт (128 бит) в памяти. В строковом представлении с дефисами — 36 символов (32 цифры + 4 дефиса). В фигурных скобках (стиль Microsoft) — 38 символов. В двоичном виде — 16 байт.

Преимущества

  • Децентрализация: не требуется центральный сервер для выдачи идентификаторов.
  • Масштабируемость: подходит для распределённых систем и баз данных с репликацией.
  • Совместимость: стандартизирован и поддерживается во всех современных языках программирования и СУБД.
  • Детерминированность (для v3/v5): один и тот же идентификатор всегда генерируется из одного и того же имени.

Недостатки

  • Размер: 16 байт значительно больше, чем 4-байтный целочисленный идентификатор (int) или 8-байтный (bigint). Это увеличивает размер индексов и замедляет операции вставки.
  • Неупорядоченность (для v4): случайные GUID плохо подходят для кластеризованных индексов в базах данных, так как вызывают фрагментацию страниц.
  • Предсказуемость (для v1): знание MAC-адреса и времени генерации может позволить восстановить момент создания идентификатора, что в некоторых случаях является проблемой безопасности.
  • Человекочитаемость: длинная строка шестнадцатеричных цифр неудобна для ручного ввода и запоминания.

Применение

Базы данных

GUID широко используется в качестве первичных ключей (Primary Key) в реляционных СУБД, особенно в системах с репликацией (например, Microsoft SQL Server, PostgreSQL, Oracle). Это позволяет избежать конфликтов при вставке записей на разных узлах.

Компонентные модели

В COM (Component Object Model) и DCOM каждый COM-класс, интерфейс и библиотека типов идентифицируются GUID, называемыми CLSID, IID и LIBID соответственно. Реестр Windows хранит эти идентификаторы для регистрации компонентов.

Файловые системы

В NTFS (Windows NT File System) каждый файл и каталог имеет уникальный идентификатор — Object ID, который представляет собой GUID. Это используется для отслеживания перемещений файлов и работы службы теневого копирования томов (Volume Shadow Copy).

Сетевые протоколы

  • UPnP (Universal Plug and Play) использует GUID для идентификации устройств и сервисов.
  • DCE/RPC (Distributed Computing Environment / Remote Procedure Call) — каждый вызов процедуры идентифицируется GUID.
  • UUID входит в состав стандарта ISO/IEC 11578:1996 для идентификации объектов в распределённых системах.

Программирование

  • .NET Framework: структура System.Guid предоставляет методы для создания, сравнения и преобразования GUID.
  • Java: класс java.util.UUID (с версии 1.5).
  • Python: модуль uuid (стандартная библиотека).
  • JavaScript: нет встроенного типа, но есть библиотеки (например, uuid npm-пакет).
  • C++: нет встроенного типа в стандартной библиотеке, но есть реализации в Boost и Windows API (CoCreateGuid, UuidCreate).

Идентификация пользователей и сессий

GUID часто используется для генерации идентификаторов сессий веб-приложений, токенов аутентификации, идентификаторов заказов в интернет-магазинах и других сущностей, где требуется уникальность без централизованного контроля.

Альтернативы

Целочисленные идентификаторы (int, bigint)

  • Преимущества: компактность (4–8 байт), высокая скорость индексации, естественная упорядоченность.
  • Недостатки: требуют централизованного генератора (автоинкремент, последовательность), проблемы при репликации.

Snowflake (Twitter)

64-битный идентификатор, состоящий из временной метки, номера рабочей машины и порядкового номера. Используется в распределённых системах (например, Discord, Instagram). Компактнее GUID, но требует координации между узлами.

ULID (Universally Unique Lexicographically Sortable Identifier)

26-символьный строковый идентификатор на основе времени и случайных данных. Сочетает свойства GUID (уникальность) и упорядоченность по времени. Используется в некоторых современных системах (например, CockroachDB).

NanoID

Короткий (21 символ по умолчанию) URL-безопасный идентификатор, генерируемый из случайных символов. Меньше GUID, но вероятность коллизии выше при больших объёмах.

Интересные факты

  • В 2019 году исследователь Бенджамин Пирс (Benjamin Pierce) обнаружил, что некоторые реализации GUID в Windows использовали неслучайные данные, что позволяло предсказывать идентификаторы. Это было исправлено в обновлениях безопасности.
  • Существует шуточный стандарт UUID v6 (неофициальный), который предлагает переупорядочить биты версии 1 для улучшения сортировки по времени. Он не принят RFC, но реализован в некоторых библиотеках.
  • В базе данных SQL Server функция NEWSEQUENTIALID() генерирует GUID, упорядоченные по времени, что уменьшает фрагментацию индексов по сравнению с NEWID().
  • В 2021 году в PostgreSQL была добавлена поддержка UUID версии 7 (временная метка + случайные данные) в расширении uuid-ossp.

Источники

  1. RFC 4122 — A Universally Unique IDentifier (UUID) URN Namespace (2005).
  2. ISO/IEC 9834-8:2014 — Information technology — Procedures for the operation of object identifier registration authorities — Part 8: Generation of universally unique identifiers (UUIDs) and their use as object identifier components.
  3. Microsoft Docs — GUID structure (Windows).
  4. PostgreSQL Documentation — UUID Type.
  5. Oracle Database Documentation — RAW and GUID Datatypes.
  6. Python Standard Library Documentation — uuid module.
  7. Java Platform, Standard Edition Documentation — java.util.UUID.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →