Si j’utilise `` quelle est la probabilité d’obtenir une collision. Il coupe des bits les moins significatifs, donc il y a une possibilité que vous exécutez dans une collision, droite ?
Réponses
Trop de publicités?Selon la documentation, randomUUID() génère un type 4 UUID.
Cela signifie que les six bits les plus significatifs sont utilisés pour un certain type d'informations et le reste de 122 bits sont attribués de manière aléatoire.
Donc, le plus important de la moitié de votre UUID contient 58 bits d'aléatoire, ce qui signifie que vous en moyenne besoin de générer 2^29 Uuid pour obtenir une collision (par rapport à 2^61 pour le plein UUID).
Donc, je dirais que vous êtes plutôt en sécurité. Notez, cependant, que ce n'est absolument pas vrai pour d'autres types de Uuid, comme Carl Seleborg mentionne.
D'ailleurs, vous seriez un peu mieux en utilisant le moins significatif de la moitié de l'UUID (ou tout simplement de générer un hasard long à l'aide de SecureRandom).
Raymond Chen a un blog vraiment excellent sur ceci :
GUID sont uniques, mais ne sont pas des sous-chaînes de GUID
Vous êtes mieux de simplement générer aléatoirement une valeur de type long, puis tous les bits sont aléatoires. Dans la version 6 de Java, new Random() utilise le Système.nanoTime() et d'un compteur comme une graine.
Il existe différents niveaux de l'unicité.
Si vous avez besoin d'unicité à travers de nombreuses machines, vous pourriez avoir une base de données centrale de la table pour l'attribution d'identificateurs uniques, ou même des lots d'identifiants uniques.
Si vous avez juste besoin d'avoir unicité dans une application, vous pouvez juste avoir un compteur ou un compteur qui commence à partir de la currentTimeMillis()*1000 ou nanoTime() en fonction de vos besoins)
Temps d'utilisation YYYYDDDD
(Année + les Jours de l'Année) comme préfixe. Cela diminue la fragmentation de la base de données dans les tables et les index. Cette méthode retourne byte[40]
. Je l'ai utilisé dans un environnement hybride où l'Active Directory SID (varbinary(85)
) est la clé pour les utilisateurs LDAP et une application auto-ID généré est utilisé pour les non-Utilisateurs LDAP. Aussi le grand nombre de transactions par jour dans les tables transactionnelles (secteur Bancaire) ne peuvent pas utiliser la norme Int
types de Clés
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();
}