TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #2414 2.8K
День 1995. #ЧтоНовенького
UUID Версии 7 в .NET 9

Спецификация UUID (универсальные уникальные идентификаторы), также известные как GUID (глобальные уникальные идентификаторы), определяет несколько различных версий UUID.

.NET использует UUID версии 4 в методе Guid.NewGuid(). Это, почти полностью случайное (или псевдослучайное) число. Но в превью 7 .NET 9 мы получим UUID версии 7.

Новый API по-прежнему находится внутри System.Guid:
var guid = Guid.CreateVersion7();

Что аналогично:
var guid = 
Guid.CreateVersion7(Guid.CreateVersion7(DateTimeOffset.UtcNow));


Основным преимуществом является перегрузка с меткой времени, включенная в UUID. Вот как устроен UUID версии 7:
| 48-bit timestamp | 12-bit random | 62-bit random |

Длина осталась прежней, но первые 48 бит занимает метка времени. Основное преимущество заключается в том, что вы можете сортировать UUID по времени их создания, что делает их более подходящими для идентификаторов в базах данных, чем UUID версии 4.

Управление меткой времени
Поскольку метод принимает DateTimeOffset, вызывающая функция может использовать TimeProvider для управления UtcNow:
var uuid = Guid.CreateVersion7(timeProvider.GetUtcNow());

timeProvider можно внедрить через DI и эмулировать в сценариях тестирования.

Интересно, что внутренний код вызывает NewGuid(), а затем заменяет его первые байты на метку времени с помощью Unsafe.AsRef. Это делает CreateVersion7() примерно в 2 раза медленнее, чем NewGuid(), но это в любом случае десятки наносекунд.

CreateVersion7 - довольно странное название метода, как по мне. Во-первых, оно какбэ намекает, что должны быть CreateVersion1, …, CreateVersion6, а их нет. А во-вторых, не соответствует методу NewGuid. То есть предполагается, что вы должны разбираться в версиях UUID, чтобы знать, какой версии UUID в NewGuid. Впрочем, возможно (и надеюсь), что к релизу .NET 9 метод переименуют.

Оригинальное предложение и дискуссия: https://github.com/dotnet/runtime/issues/103658

Источник: https://steven-giesel.com/blogPost/ea42a518-4d8b-4e08-8f73-e542bdd3b983/uuid-v7-in-net-9
  • 👍 33
More from @netdeveloperdiary
  1. Sep 29, 2026Фото 3 (с) Анатолий Кулаков
  2. Sep 29, 2026День 2799. Конференция DotNext 2026. Часть 1 25 и 26 сентября в Москве прошла очередная ко…
  3. Sep 28, 2026День 2798. #Оффтоп Утиная Типизация в C# с Помощью Перехватчиков. Часть 2 Некоторое время…
  4. Sep 27, 2026День 2797. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Окончание Начало Продол…
  5. Sep 26, 2026День 2796. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Продолжение Начало Три…
  6. Sep 25, 2026День 2795. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Начало Проблема с позиц…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →