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