Crie um GUID em Java

377

Quais são algumas das melhores maneiras de criar um GUID em Java?

Chris Dutrow
fonte
3
A questão em stackoverflow.com/questions/325443/generate-uuid-in-java é mais sobre colisões de GUID, então como o equivalente a um GUID é na pilha de tecnologia Java, que é o que (eu acho) é mais o foco desta questão.
John Adams

Respostas:

347

Dê uma olhada na classe UUID incluída no Java 5 e posterior.

Por exemplo:

  • Se você deseja um UUID aleatório, pode usar o método randomUUID .
  • Se você deseja que um UUID seja inicializado com um valor específico, use o construtor UUID ou o método fromString .
Mark Byers
fonte
7
Se você incluir um exemplo como o Kaleb Brasee, sua boa resposta seria ainda melhor.
Zero3 11/01
Funciona no AndroidStudio 2.3 e nos níveis de API 21 e além, pelo menos. Talvez mais para trás também.
Raddevus
5
TL; DR ... "UUID uuid = UUID.randomUUID ();"
Aviram Fireberger 13/08/18
419

java.util.UUID.randomUUID();

Kaleb Brasee
fonte
2
poderia voltar a repetir? porque Guid nunca vai se repetir
angel
4
@angel Sim, é teoricamente possível que o UUID.randomUUIDmétodo retorne uma duplicata, mas isso não é uma preocupação realista . A implementação Oracle / OpenJDK usa um gerador de números aleatórios criptograficamente forte. Dado isso, e considerando o alcance astronômico fornecido por tantos bits em um UUID, você pode gerar muitos milhões desses valores em seu aplicativo e ainda dormir bem. O uso de uma das outras variantes reduz ainda mais a possibilidade de colisões ainda mais próximas de zero devido ao uso de "espaço e tempo", [1] endereço ou nome MAC e [2] data e hora atuais, como restrições.
Basil Bourque
@RenniePet Eh, se você é paranóico e tem acesso à lista dos IDs já usados ​​ao criar um novo, basta gerar novos em um whileaté encontrar um que não esteja na sua lista: p
Nyerguds
2
O gerador de números aleatórios criptográficos Oracle normalmente é um PRNG com uma semente aleatória. A semente aleatória é normalmente obtida usando uma fonte de "entropia" fornecida pelo sistema operacional. Se você pode degradar ou comprometer essa fonte, a probabilidade de um gerador de números aleatórios criptografados produzindo o mesmo número é aumentada. Também é importante notar que em algumas plataformas (por exemplo, virtualizadas), o sistema operacional pode ficar sem entropia. Existem "hacks desonestos" para contornar isso, mas implicam degradar a qualidade da entropia.
Stephen C
Esta não é apenas uma preocupação acadêmica. Eu vi uma alegação ( não verificada !! ) de que alguém teve problemas com os UUIDs baseados em aleatórios que não eram únicos.
Stephen C
32

Depende do tipo de UUID que você deseja.

  • A UUIDclasse Java padrão gera UUIDs da versão 4 (aleatórios). ( UPDATE - UUIDs da versão 3 (nome) também podem ser gerados.) Ele também pode manipular outras variantes, embora não possa gerá-las. (Neste caso, os meios de pega "" construção de UUIDcasos de long, byte[]ou Stringrepresentações, e fornecer alguns assessores apropriadas).

  • A implementação do Java UUID Generator (JUG) pretende suportar "todos os 3 tipos 'oficiais' de UUID, conforme definido pelo RFC-4122 " ... embora o RFC realmente defina 4 tipos e mencione um quinto tipo.

Para obter mais informações sobre tipos e variantes de UUID, há um bom resumo na Wikipedia , e os detalhes sangrentos estão no RFC 4122 e nas outras especificações.

Stephen C
fonte
11
Não totalmente verdade, ele também pode gerar UUIDs baseados em nome (versão 3) comUUID.nameUUIDFromBytes(byte[] name)
DennisK
Eu estou corrigido. Confiei na descrição do javadoc, que diz "Fábrica estática para recuperar um UUID do tipo 3 (baseado em nome), com base na matriz de bytes especificada".
Stephen C
Não acho que a postagem seja precisa. Os documentos Java do UUID afirmam que o construtor gera uma variante do tipo 2, não aleatória. Para o tipo 3, use public static UUID nameUUIDFromBytes(byte[] name). para uso tipo 4 public static UUID randomUUID(). O tipo 1 não está disponível na classe JDK.
Slartibartfast
Não. Acho que entendi direito. O javadocs declara: "embora os construtores permitam a criação de qualquer variante do UUID (descrita abaixo)." e 4 variantes estão listadas abaixo, incluindo o tipo 1. De fato, leia o javadoc paraclockSequence()
Stephen C
27

Apenas para estender a resposta de Mark Byers com um exemplo:

import java.util.UUID;

public class RandomStringUUID {
    public static void main(String[] args) {
        UUID uuid = UUID.randomUUID();
        System.out.println("UUID=" + uuid.toString() );
    }
}
Anton Belev
fonte
7

As outras respostas estão corretas, especialmente este por Stephen C .

Alcançando fora do Java

A geração de um valor UUID em Java é limitada à Versão 4 (aleatória) devido a questões de segurança.

Se você deseja outras versões de UUIDs, uma alternativa é fazer com que seu aplicativo Java alcance fora da JVM para gerar UUIDs chamando:

  • Utilitário de linha de comando
    Incluído em quase todos os sistemas operacionais.
    Por exemplo, uuidgenencontrado no Mac OS X, BSD e Linux.
  • Servidor de banco de dados
    Use o JDBC para recuperar um UUID gerado no servidor de banco de dados.
    Por exemplo, a uuid-osspextensão geralmente acompanha o Postgres . Essa extensão pode gerar os valores das versões 1, 3 e 4 e, além disso, algumas variações:
    • uuid_generate_v1mc() - gera um UUID da versão 1, mas usa um endereço MAC multicast aleatório em vez do endereço MAC real do computador.
    • uuid_generate_v5(namespace uuid, name text) - gera um UUID versão 5, que funciona como um UUID versão 3, exceto que o SHA-1 é usado como um método de hash.
  • Serviço da Web
    Por exemplo, o UUID Generator cria as versões 1 e 3, assim como valores nulos e GUID .
Basil Bourque
fonte
3
Tenho alguns problemas com sua resposta: Primeiro, já foi demonstrado que você só pode obter o V4 da biblioteca Java padrão (o V3 também é possível). Em segundo lugar, você faz parecer que não há opções dentro do Java além da biblioteca padrão, junto com um aceno manual "por questões de segurança". E, por último, é geralmente ineficiente (em termos de programação e / ou desempenho) começar a depender de fontes externas, quando há muitas maneiras de fazê-lo em Java (a menos que você precise delas, é claro, por exemplo, como parte da criação de um registro no servidor SQL).
DennisK