Что такое GUID против UUID
Всё дело в моменте появления. Когда в начале 1990-х Microsoft добавила глобально уникальные идентификаторы в COM, термин GUID уже использовался внутри компании — и закрепился в OLE, Active Directory, реестре Windows и .NET. А линейка документов RFC описала ту же структуру как UUID. Оба термина описывают 128-битное число, записанное 32 шестнадцатеричными цифрами в группах 8-4-4-4-12. При переводе одного в другое не меняется ни один бит.
Различается запись. В экосистеме Microsoft GUID обычно пишут заглавными буквами и в фигурных скобках — {4C6E0549-82B1-47B0-9479-211A64583258} — потому что именно такую форму выдаёт спецификатор "B" в Guid.ToString() и показывают инструменты SQL Server. Формат RFC — строчные буквы без скобок. Сравнение регистронезависимо, и почти все парсеры принимают оба вида, так что это косметика — но именно из-за неё двое могут смотреть на одно значение и считать, что они разные.
Единственное место, где различие реально, — порядок сортировки. Тип uniqueidentifier в SQL Server сравнивает последние шесть байтов раньше остальных, поэтому ORDER BY по такому столбцу не даёт ни порядка вставки, ни алфавитного порядка. Это свойство конкретного типа колонки, а не GUID как такового.
Как использовать
- Нужно значение для .NET
Guid, колонки SQL Server или интерфейса COM? Сгенерируйте здесь — фигурные скобки и верхний регистр включаются одним флажком. - Сравниваете два идентификатора, которые выглядят по-разному? Уберите скобки и дефисы, приведите к нижнему регистру — если 32 шестнадцатеричные цифры совпали, значения одинаковы.
- Храните GUID в SQL Server и сортируете по ним? Не считайте, что порядок что-то значит: добавьте явный столбец создания или используйте значения v7, сгенерированные в приложении.
Сценарии
- Разработка на .NET и Windows, где в API стоит
Guid, а инструменты показывают скобки. - Таблицы SQL Server, где тип называется
uniqueidentifierи принимает обе формы написания. - Кросс-платформенные API, где значение выходит из мира Microsoft и снова становится UUID.
Сравнение GUID против UUID с другими форматами
| Вариант | Когда использовать |
|---|---|
GUID | Название от Microsoft. Обычно {ЗАГЛАВНЫМИ} в скобках. |
UUID | Название из RFC 9562. Строчные буквы, дефисы, без скобок. |
Значение | Одинаковое. 128 бит, 16 байт, 32 шестнадцатеричные цифры. |
uniqueidentifier в SQL Server | Сравнивает последние шесть байтов первыми — это не порядок вставки. |
Разбор строки | Регистронезависимо; обе формы принимаются. |
Примеры кода
C# / .NET
// случайный, эквивалент UUID v4
Guid a = Guid.NewGuid();
// упорядоченный по времени (v7), .NET 9+
Guid b = Guid.CreateVersion7();
// три распространённые формы строки
a.ToString("D"); // 4c6e0549-82b1-47b0-9479-211a64583258
a.ToString("B"); // {4c6e0549-82b1-47b0-9479-211a64583258}
a.ToString("N"); // 4c6e054982b147b09479211a64583258
Python
import uuid
# Это и есть GUID в терминах .NET.
u = uuid.uuid4()
print(u) # 4c6e0549-82b1-47b0-9479-211a64583258
print(u.hex) # 4c6e054982b147b09479211a64583258
print(len(u.bytes)) # 16
# Строка со скобками из .NET разбирается без изменений.
uuid.UUID('{4C6E0549-82B1-47B0-9479-211A64583258}')
SQL Server
-- генерация
SELECT NEWID(); -- случайный, эквивалент v4
SELECT NEWSEQUENTIALID(); -- упорядоченный, только как значение по умолчанию
-- и помните: ORDER BY по uniqueidentifier — это не порядок создания
Частые вопросы
GUID — это точно то же самое, что UUID?
Да. Оба термина описывают один и тот же 128-битный идентификатор. GUID из Guid.NewGuid() — это корректный UUID v4, и наоборот. Оба названия живут потому, что Microsoft выпустила свою аббревиатуру раньше, чем распространилась лексика RFC.
Почему GUID пишут заглавными буквами в скобках?
Это формат "B" в .NET и то, что показывают инструменты SQL Server. Формат этого не требует: сравнение регистронезависимо, и значение без потерь переживает перевод в строчный вид без скобок.
GUID менее уникален, чем UUID?
Нет. Версия и энтропия относятся к формату, а не к названию: у GUID v4 те же 122 случайных бита, что и у UUID v4, и вероятность коллизии та же. Если система выдаёт слабые идентификаторы, проблема в генераторе, а не в названии.