Ordenação em Guid? conheça o novo tipo UUID v7 que virá no .NET 9

Marcio Nizzola
3 min readAug 16, 2024

--

Quando nós utilizamos Guid para definição de chaves únicas não numéricas no .NET, com o comando Guid.NewGuid que cria um UUID v4, há um problema, eles não seguem uma ordem cronológica, e acabamos tendo que utilizar outros campos para ordenar os registros ao consultar o banco de dados, usando campos como data da Gravação ou Update.

Mas o .NET 9 traz uma novidade que vai proporcionar uma solução, teremos um novo tipo o UUID v7, que inclui um trecho de data e hora no seu código, possibilitando a ordenação.

Como criar um UUID v7? Utilizando a versão do .Net 9 Preview 7, fiz um teste e pude gerá-lo com o seguinte comando:

var uuidwithdate = Guid.CreateVersion7();

Gerando vários UUID com um intervalo de 10 segundos entre eles, podemos ver a diferença:

O que ocorre é que há blocos baseados em data e hora, e outros randômicos, fazendo com que os números possam passar por uma ordenação.

Isso dá 122 bits de entropia com 6 bits para versão e variante em algum lugar no meio. A principal vantagem é que você pode classificar os UUIDs pelo tempo de criação, tornando-os mais adequados para bancos de dados do que o UUID v4.

Controlando o carimbo de data/hora

Podemos controlar a geração? Com datas e horas diferentes? Muitas vezes precisamos gerar diferentes em testes, e agora?

Como o método espera, uma função de chamada pode utilizar um TimeProvider para controlar:DateTimeOffsetUtcNow

var uuid = Guid.CreateVersion7(timeProvider.GetUtcNow());

Por que UUIDv7 é melhor para bancos de dados:

  • Ordenação Natural: Bancos de dados tradicionais precisam de colunas adicionais para ordenar registros por tempo de criação. Com UUIDv7, isso é feito diretamente pelo próprio UUID, eliminando a necessidade dessas colunas extras.
  • Indexação Otimizada: Como UUIDv7 é ordenável por tempo, os mecanismos de indexação dos bancos de dados podem otimizar melhor o armazenamento e a recuperação de dados, resultando em consultas mais rápidas, especialmente as baseadas em tempo.
  • Concorrência e Distribuição: Em sistemas distribuídos, gerar IDs únicos e sequenciais pode ser difícil. UUIDv7 pode ser gerado simultaneamente em vários nós sem risco de colisões, tornando-o ideal para arquiteturas distribuídas.
  • Menor Sobrecarga: Ao contrário do UUIDv1, que pode expor o endereço MAC da máquina onde foi gerado (causando preocupações de privacidade), UUIDv7 não tem esse problema, reduzindo a necessidade de mascarar ou anonimizar esses dados.
  • Flexibilidade: Bancos de dados que suportam armazenamento binário podem armazenar UUIDv7 de forma eficiente, e ele pode ser facilmente codificado em outros formatos, como strings, se necessário.

Agora o que fazer? Caso queira utilizar em aplicações reais, é importante destacar que isso só estará disponível na versão final do .NET 9 a ser lançada em Novembro de 2024.

Gostou do artigo? clique no ícone👏, compartilhe com os amigos e me siga para ver as próximas publicações !! Quer ver mais conteúdos, acesse minhas redes através do Linktree: https://linktree.com/nizzola

Referências:

--

--

Marcio Nizzola

Microsoft MVP | Software Architect na CI&T | Prof. da Etec Itu | Membro Fundador da Comunidade Itu Developers.