День 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/runhottg.com/issues/103658
Источник: https://steven-giesel.com/blogPost/ea42a518-4d8b-4e08-8f73-e542bdd3b983/uuid-v7-in-net-9
>>Click here to continue<<