Ordenação em Guid? conheça o novo tipo UUID v7 que virá no .NET 9
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