Что такое GUID в C#
Guid.NewGuid() возвращает GUID версии 4, созданный криптографическим провайдером. Метод есть в любой версии .NET, и это обычный выбор для ключей сущностей, идентификаторов сообщений и ключей кеша. Тип является структурой, поэтому поле Guid занимает 16 байт без выделения памяти в куче.
В .NET 9 добавился Guid.CreateVersion7(), следующий RFC 9562: значение начинается с метки времени Unix в миллисекундах. Это тот вариант, который нужен для кластеризованного или индексируемого столбца: новые строки попадают рядом, а не разбрасываются по дереву. Там же появилась перегрузка с DateTimeOffset, позволяющая создать v7 для конкретного момента. GUID записывается в пяти формах: D (с дефисами), N (32 цифры), B (фигурные скобки), P (круглые скобки) и X (с префиксами 0x) — выбирайте ту, которую ожидает другая система.
Как использовать
- Вызовите
Guid.NewGuid()для случайного значения v4. - В .NET 9+ используйте
Guid.CreateVersion7()для упорядоченного по времени значения. - Примените
ToString("B")илиToString("N"), чтобы получить нужный формат; форматтер выше делает то же для целого списка.
Сценарии
- Ключи Entity Framework Core: значение задаётся в модели, поэтому ключ существует ещё до INSERT.
- Столбцы UNIQUEIDENTIFIER в SQL Server, где
NEWID()даёт v4, аNEWSEQUENTIALID()— последовательное значение. - Распределённые системы и идентификаторы сообщений, где каждый узел должен создавать значение без координации.
Сравнение GUID в C# с другими форматами
| Вариант | Когда использовать |
|---|---|
Guid.NewGuid() | v4, случайный, доступен везде. |
Guid.CreateVersion7() | RFC 9562, упорядочен по времени, .NET 9 и новее. |
NEWSEQUENTIALID() | Последовательное значение на стороне SQL Server; уникально в пределах индекса, но не является v7. |
Entity Framework Core | Генерация на клиенте сохраняет целостность графа до SaveChanges. |
Примеры кода
Случайный v4
using System;
Guid id = Guid.NewGuid();
Console.WriteLine(id); // 550e8400-e29b-41d4-a716-446655440000
Console.WriteLine(id.ToString("N")); // 550e8400e29b41d4a716446655440000
Console.WriteLine(id.ToString("B")); // {550e8400-e29b-41d4-a716-446655440000}
Упорядоченный v7 (.NET 9+)
using System;
Guid v7 = Guid.CreateVersion7();
Console.WriteLine(v7); // 019535d9-3df7-79fb-b466-fa907fa17f9e
Console.WriteLine(v7.Version); // 7
// Конкретный момент, например для заливки истории
Guid historical = Guid.CreateVersion7(
new DateTimeOffset(2025, 1, 1, 0, 0, 0, TimeSpan.Zero));
Спецификаторы формата
Guid g = Guid.NewGuid();
g.ToString("N"); // 32 цифры без дефисов
g.ToString("D"); // 8-4-4-4-12, по умолчанию
g.ToString("B"); // фигурные скобки, форма для конфигов .NET
g.ToString("P"); // круглые скобки
g.ToString("X"); // шестнадцатеричный вид: 0x...
Безопасный разбор
if (Guid.TryParse(input, out Guid parsed))
{
// формат корректен
}
else
{
// отклонить ввод вместо исключения
Частые вопросы
GUID — это то же самое, что UUID?
Да. GUID — название той же 128-битной структуры в терминологии Microsoft; Guid в .NET побайтово совместим с UUID. Разница лишь в терминологии и в том, что платформа дополнительно предлагает запись в скобках.
Что выбрать для ключей SQL Server: v4 или v7?
Если GUID — кластеризованный ключ, то v7 (или NEWSEQUENTIALID()) сохраняет индекс компактным: случайные v4 вызывают разбиение страниц, потому что каждая вставка попадает в новое место дерева. Для некластеризованного ключа v4 вполне подходит.
Сколько места занимает GUID?
16 байт в базе при хранении в родном типе uniqueidentifier или 36 символов в текстовом виде. Текст занимает более чем вдвое больше и медленнее сравнивается, поэтому по возможности используйте родной тип.