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, которые различаются способом генерации:
| Версия | Название | Метод генерации | Применение |
|---|---|---|---|
| v1 | Time-based | На основе текущего времени (100-наносекундные интервалы с 15 октября 1582 года) и MAC-адреса сетевого интерфейса | Системы, где важна хронологическая упорядоченность |
| v2 | DCE Security | На основе времени, идентификатора пользователя (UID) и группы (GID) | Распределённые вычислительные среды DCE |
| v3 | Name-based (MD5) | Хеширование MD5 от имени (например, URL) и пространства имён | Создание детерминированных идентификаторов |
| v4 | Random | Случайные или псевдослучайные числа | Наиболее распространённая версия; используется в большинстве современных приложений |
| v5 | Name-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: нет встроенного типа, но есть библиотеки (например,
uuidnpm-пакет). - 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.
Источники
- RFC 4122 — A Universally Unique IDentifier (UUID) URN Namespace (2005).
- 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.
- Microsoft Docs — GUID structure (Windows).
- PostgreSQL Documentation — UUID Type.
- Oracle Database Documentation — RAW and GUID Datatypes.
- Python Standard Library Documentation — uuid module.
- Java Platform, Standard Edition Documentation — java.util.UUID.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →