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
| Parte | Hex | Bits | Bytes |
|---|---|---|---|
| A | 8 | 32 | 4 |
| B | 4 | 16 | 2 |
| C | 4 | 16 | 2 |
| D | 4 | 16 | 2 |
| E | 12 | 48 | 6 |
| Total | — | 128 | 16 |
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ão | Valor hexadecimal |
|---|---|
| v1 | 1 |
| v3 | 3 |
| v4 | 4 |
| v5 | 5 |
| v7 | 7 |
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.Empty→Guid.Emptynão representa um ID, apenas a ausência de um. - Não confie em GUID como segredo
- Continue usando campos de data para auditoria