Skip to main content

Guids | Csharp

  • Guids | Csharp

O que é um GUID?

Um GUID (Globally Unique Identifier) é um identificador único global de 128 bits (16 bytes). No .NET, ele é representado pela struct:

System.Guid

Formato textual padrão:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Exemplo:

018f2d8a-6a9e-7c33-9b3e-9b8b8a1a6e42

Estrutura geral de um GUID

Um GUID é dividido visualmente em 5 grupos hexadecimais, apenas para facilitar leitura e interoperabilidade.

AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE

Tamanho de cada parte

ParteHexBitsBytes
A8324
B4162
C4162
D4162
E12486
Total12816

Internamente, o GUID é apenas um array de bytes — o formato acima é apenas uma representação textual padronizada.


O que cada parte do GUID representa

Parte A — Campo de dados principal (32 bits)

AAAAAAAA
  • Pode conter:

    • Parte do timestamp (GUID v7)
    • Dados aleatórios (GUID v4)
  • Não possui significado fixo isoladamente

  • Em GUIDs temporais, participa da ordenação


Parte B — Campo secundário (16 bits)

-BBBB-
  • Continuação dos dados principais
  • Em GUIDs baseados em tempo, também participa do timestamp
  • Em GUID v4, é puramente aleatório

Parte C — Versão do UUID (16 bits)

-CCCC-

versão

Os 4 bits mais significativos deste bloco indicam a versão do UUID.

VersãoValor hexadecimal
v11
v33
v44
v55
v77

Exemplo (GUID v7):

018f2d8a-6a9e-7c33-....

versão 7

Parte D — Variante do UUID (16 bits)

-DDDD-

variante

Os bits mais significativos definem a variante, que indica o layout do GUID.

No .NET e na maioria dos sistemas modernos, a variante é:

10xx (RFC 4122 / RFC 9562)

Isso garante compatibilidade com o padrão UUID moderno.


Parte E — Dados finais (48 bits)

-EEEEEEEEEEEE
  • Contém:

    • Parte aleatória
    • Parte do timestamp (GUID v7)
  • Responsável por grande parte da unicidade

  • Em GUID v7, garante entropia mesmo quando vários GUIDs são gerados no mesmo milissegundo


Diferença estrutural entre GUID v4 e v7

GUID v4 (aleatório)

[ Random ][ Random ][ v4 ][ Var ][ Random ]
  • 122 bits aleatórios
  • Sem relação com tempo
  • Totalmente não ordenável

Exemplo:

c9c7b4b1-1d42-4e9c-b9a1-fad6c78b1a02

GUID v7 (tempo + aleatório) – .NET 9

[ Timestamp ][ Timestamp ][ v7 ][ Var ][ Random ]
  • Timestamp Unix (ms) nos bits mais significativos
  • Parte final aleatória
  • Ordenável por tempo de criação

Exemplo:

018f2d8a-6a9e-7c33-9b3e-9b8b8a1a6e42

GUIDs criados próximos no tempo compartilham prefixos semelhantes.


Exemplos no .NET

GUID v4 (tradicional)

Guid id = Guid.NewGuid();
Console.WriteLine(id);

GUID v7 (.NET 9)

Guid id = Guid.CreateVersion7();
Console.WriteLine(id);

GUID v7 com data específica

var date = new DateTimeOffset(2024, 10, 1, 12, 0, 0, TimeSpan.Zero);
Guid id = Guid.CreateVersion7(date);

Console.WriteLine(id);

Implicações práticas da estrutura

Ordenação

  • GUID v4: ordenação não reflete criação
  • GUID v7: ordenação aproxima ordem temporal

Banco de dados

  • GUID v4: maior fragmentação de índice
  • GUID v7: melhor localidade de escrita

Segurança

  • Bits previsíveis no v7 → não usar como token
  • GUID não é mecanismo de autenticação

Boas práticas

  • Use GUID v4 para identificação distribuída simples
  • Use GUID v7 quando ordenação e performance importam
  • Nunca use Guid.EmptyGuid.Empty não representa um ID, apenas a ausência de um.
  • Não confie em GUID como segredo
  • Continue usando campos de data para auditoria