Si j'utilise Long uuid = UUID.randomUUID().getMostSignificantBits()
la probabilité de collision. Il coupe les bits les moins significatifs, il y a donc une possibilité que vous rencontriez une collision, non?
Selon la documentation , la méthode statique UUID.randomUUID()
génère un UUID de type 4.
Cela signifie que six bits sont utilisés pour certaines informations de type et les 122 bits restants sont attribués de manière aléatoire.
Les six bits non aléatoires sont répartis avec quatre dans la moitié la plus significative de l'UUID et deux dans la moitié la moins significative. Ainsi, la moitié la plus importante de votre UUID contient 60 bits de caractère aléatoire, ce qui signifie que vous devez en moyenne générer 2 ^ 30 UUID pour obtenir une collision (contre 2 ^ 61 pour l'UUID complet).
Je dirais donc que vous êtes plutôt en sécurité. Notez, cependant, que ce n'est absolument pas vrai pour d'autres types d'UUID, comme le mentionne Carl Seleborg.
Soit dit en passant, vous seriez un peu mieux en utilisant la moitié la moins significative de l'UUID (ou en générant simplement un long aléatoire à l'aide de SecureRandom).
Raymond Chen a un excellent article de blog à ce sujet:
Les GUID sont globalement uniques, mais les sous-chaînes de GUID ne le sont pas
la source
Je pense que c'est le meilleur exemple pour utiliser randomUUID:
http://www.javapractices.com/topic/TopicAction.do?Id=56
la source
Il vaut mieux simplement générer une valeur longue aléatoire, alors tous les bits sont aléatoires. Dans Java 6, le nouveau Random () utilise le System.nanoTime () plus un compteur comme graine.
Il existe différents niveaux d'unicité.
Si vous avez besoin d'unicité sur de nombreuses machines, vous pouvez disposer d'une table de base de données centrale pour allouer des ID uniques, voire des lots d'ID uniques.
Si vous avez juste besoin d'unicité dans une application, vous pouvez simplement avoir un compteur (ou un compteur qui commence à partir de currentTimeMillis () * 1000 ou nanoTime () selon vos besoins)
la source
Utiliser le temps
YYYYDDDD
(Year + Day of Year) comme préfixe. Cela réduit la fragmentation de la base de données dans les tables et les index. Cette méthode revientbyte[40]
. Je l'ai utilisé dans un environnement hybride où l'Active Directory SID (varbinary(85)
) est la clé pour les utilisateurs LDAP et un ID généré automatiquement par l'application est utilisé pour les utilisateurs non LDAP. De plus, le grand nombre de transactions par jour dans les tables transactionnelles (secteur bancaire) ne peut pas utiliser lesInt
types standard pour les clésla source