Respostas:
De acordo com a documentação , o método estático UUID.randomUUID()
gera um UUID do tipo 4.
Isso significa que seis bits são usados para algumas informações de tipo e os 122 bits restantes são atribuídos aleatoriamente.
Os seis bits não aleatórios são distribuídos com quatro na metade mais significativa do UUID e dois na metade menos significativa. Portanto, a metade mais significativa do seu UUID contém 60 bits de aleatoriedade, o que significa que, em média, você precisa gerar 2 ^ 30 UUIDs para obter uma colisão (em comparação com 2 ^ 61 para o UUID completo).
Então, eu diria que você está bem seguro. Observe, no entanto, que isso não é absolutamente verdade para outros tipos de UUIDs, como Carl Seleborg menciona.
Aliás, você seria um pouco melhor usando a metade menos significativa do UUID (ou apenas gerando um tempo aleatório usando o SecureRandom).
Raymond Chen tem um excelente post sobre isso:
GUIDs são globalmente exclusivos, mas as substrings de GUIDs não são
Eu acho que este é o melhor exemplo para usar randomUUID:
É melhor gerar apenas um valor longo aleatório, e todos os bits são aleatórios. No Java 6, o novo Random () usa o System.nanoTime () mais um contador como semente.
Existem diferentes níveis de exclusividade.
Se você precisar de exclusividade em muitas máquinas, poderá ter uma tabela de banco de dados central para alocar IDs exclusivos ou até lotes de IDs exclusivos.
Se você só precisa ter exclusividade em um aplicativo, pode simplesmente ter um contador (ou um contador que comece no currentTimeMillis () * 1000 ou nanoTime (), dependendo de seus requisitos)
Use Hora YYYYDDDD
(Ano + Dia do Ano) como prefixo. Isso diminui a fragmentação do banco de dados em tabelas e índices. Este método retorna byte[40]
. Usei-o em um ambiente híbrido onde o SID do Active Directory ( varbinary(85)
) é a chave para usuários LDAP e um ID gerado automaticamente pelo aplicativo é usado para usuários não LDAP. Além disso, o grande número de transações por dia em tabelas transacionais (setor bancário) não pode usar Int
tipos padrão para chaves
private static final DecimalFormat timeFormat4 = new DecimalFormat("0000;0000");
public static byte[] getSidWithCalendar() {
Calendar cal = Calendar.getInstance();
String val = String.valueOf(cal.get(Calendar.YEAR));
val += timeFormat4.format(cal.get(Calendar.DAY_OF_YEAR));
val += UUID.randomUUID().toString().replaceAll("-", "");
return val.getBytes();
}