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.
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.
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:
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.
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).
Respostas:
Dê uma olhada na classe UUID incluída no Java 5 e posterior.
Por exemplo:
fonte
java.util.UUID.randomUUID();
fonte
UUID.randomUUID
mé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.while
até encontrar um que não esteja na sua lista: pDepende do tipo de UUID que você deseja.
A
UUID
classe 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 deUUID
casos delong
,byte[]
ouString
representaçõ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.
fonte
UUID.nameUUIDFromBytes(byte[] name)
public static UUID nameUUIDFromBytes(byte[] name)
. para uso tipo 4public static UUID randomUUID()
. O tipo 1 não está disponível na classe JDK.clockSequence()
Apenas para estender a resposta de Mark Byers com um exemplo:
fonte
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:
Incluído em quase todos os sistemas operacionais.
Por exemplo,
uuidgen
encontrado no Mac OS X, BSD e Linux.Use o JDBC para recuperar um UUID gerado no servidor de banco de dados.
Por exemplo, a
uuid-ossp
extensã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.Por exemplo, o UUID Generator cria as versões 1 e 3, assim como valores nulos e GUID .
fonte