Definição
O UUID nada mais é que um identificador único global de 128 bytes que não depende de uma autoridade central.
Um exemplo de um identificador único:
2e35a510-8060-4845-86d2-3bf95d43b3a2
Eles podem ser gerados baseados em tempo, endereços MAC, hashes e números aleatórios, sendo essa última, a maneira que vamos abordar nesse artigo.
Representação
Um UUID é representado por 32 dígitos em caixa baixa, exibidos em cinco grupos separados por hífens, no formato 8-4-4-4-12 para um total de 36 caracteres (32 caracteres alfanuméricos e 4 hifens).
É usado essa forma para representar um UUID vazio:
00000000-0000-0000-0000-000000000000
JAVA
Na linguagem Java temos a classe UUID no pacote java.util.
Um exemplo como seria uma implementação usando o gerador randômico:
import java.util.UUID;
class demo {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
System.out.println("UUID: " + uuid.toString());
}
}
Usos
Os UUID são normalmente usados em sistemas que registram uma grande quantidade de dados. Eles podem ser usados para identificarem unicamente, por exemplo:
- registros em banco de dados
- nomes de arquivos
- eventos
- registros em logs
- ocultar para um cliente, seu verdadeiro identificador dos seus registros em um banco de dados
- dentre outros
Uma desvantagem de usar UUID é que ele ocupará muito mais espaço em memória ou em disco.
Os UUID’s são realmente únicos?
É possível ocorrer duplicações na geração de UUID, como não existe uma autoridade central, cada thread, instância ou servidor poderá gerar seus identificadores únicos, de forma independente, sendo impossível acompanhar quais identificadores únicos foram emitidos anteriormente.
Mas as duplicações podem ocorrer com mais frequência quando é gerado uma quantidade muito grande de identificadores únicos.
Para se ter uma ideia, seriam necessários gerar 2,71 quintulhões de números UUID aleatórios na versão 4 para se ter uma probabilidade de 50% de pelo menos uma duplicação. Podemos considerar que a possibilidade de uma duplicação é quase zero, mas se isso será um problema vai depender o quão crítica uma duplicidade é para sua aplicação.
Por exemplo, se houver uma duplicação de identificadores de um log, podemos presumir que esse impacto não é crítico, mas uma duplicação de identificadores de transações de pagamentos pode ser algo bem crítico para uma aplicação.
UUID como chaves primarias em bancos de dados relacionais
Apesar da maioria das aplicações não sejam necessários tratamentos ou validações adicionais para as duplicidades de UUID, sua aplicação deve ser capaz pelo menos de retornar para um estado disponível e consistente quando um erro do tipo ocorra.
Para entendermos melhor vejamos a definição de chave primária:
- A restrição de chave primária identifica exclusivamente cada registro em uma tabela.
- As chaves primárias devem conter valores exclusivos e não podem conter valores nulos.
- Uma tabela pode ter apenas uma chave primária; e na tabela, esta chave primária pode ser constituída por uma ou várias colunas (campos).
Hoje em dia, na maioria dos sistemas de gerenciamento de bancos de dados relacionais, ao tentar inserir ou atualizar um campo, contendo uma restrição de chave primária ou única, em um registro na tabela de forma duplicada, uma exceção provavelmente será lançada. Um exemplo de exceção lançada pelo banco de dados oracle:
ORA-00001 unique constraint violated
Ou uma exceção lançada por uma ferramenta de mapeamento objeto relacional. Um exemplo de exceção lançada pelo hibernate:
ConstraintViolationException
Sua aplicação deve ser capaz, de quando violar uma chave primária ou única, fazer o tratamento adequado. Por exemplo, caso ao gravar uma chave duplicada o seu banco de dados possa lançar um erro e sua aplicação ser capaz de trata-la de forma adequada para sua aplicação ou para os clientes, sejam eles usuários ou outras aplicações.
Se as duplicações forem críticas para um aplicativo, algumas possibilidades seriam adicionar tratamentos de erros e métricas para gerar um novo UUID e rastrear a contagem de duplicidade.
Uma desvantagem de usar uma chave primaria aleatória é o aumento da fragmentação das páginas dos índices em banco de dados relacionais.
Conclusão
Portanto, o uso de UUID é ferramenta usada para referenciar uma quantidade grande de informações, sendo quase únicos. Mas o seu consumo de memória e/ou disco e suas possibilidades, mesmo que quase que impossíveis, se consideramos o tempo de vida das aplicações atuais e do próprio armazenamentos de dados de uma pessoa em vida. Podemos concluir que é os UUID’s são ideais para essa função de identificadores únicos, levando em consideração os contra pontos desse artigo.
Referências
- RFC 4122 - IETF
- UUID Generator
- Classe UUID
- Gerando duplicações UUID em Java Gist jadamcrain
- Restrições de chaves primárias em SQL - W3schools