367 votes

Quelle est java ' s UUID.randomUUID ?

Je sais UUID randomisé ont très très très faible probabilité de collision en théorie, mais je me demande, dans la pratique, quelle est randonUUID java 5 en termes de ne pas avoir collision ? Quelqu'un a-t-il une expérience à partager ?

195voto

Michael Borgwardt Points 181658

UUID utilise java.security.SecureRandom, ce qui est censé être "fort niveau de chiffrement". Alors que la mise en œuvre effective n'est pas spécifiée et peut varier entre les machines virtuelles (ce qui signifie que toute béton déclarations ne sont valables que pour une JVM), il n'y mandat que la sortie doit passer une statistique générateur de nombre aléatoire de test.

Il est toujours possible pour une mise en œuvre à contenir des bogues subtils qui ruine tout cela (voir OpenSSH génération de la clé de bug), mais je ne pense pas qu'il n'y a aucune raison de s'inquiéter à propos de Java Uuid du hasard.

132voto

sheki Points 2247

76voto

Stephen C Points 255558

Ne quelqu'un a des expériences à partager?

Il y a 2^122 des valeurs possibles d'un type 4 UUID. (La spec dit que vous perdez 2 bits pour le type, et 4 bits pour un numéro de version.)

En supposant que vous avez été pour générer 1 million de hasard Uuid une seconde, les chances d'un double qui se produisent dans votre vie serait extrêmement petite. (Et pour détecter les doublons, vous aurez à résoudre le problème de la comparaison de 1 million de nouveaux Uuid par seconde contre tous les Uuid vous avez généré précédemment!)

Les chances que quelqu'un a de l'expérience (c'est à dire remarqué) un duplicata, en réalité, sont encore plus petites que extrêmement petite ... à cause de la difficulté de la recherche.

Maintenant, bien sûr, vous aurez généralement à l'aide d'un générateur de nombres pseudo aléatoires, pas une source de nombres réellement aléatoires. Mais je pense que nous pouvons être sûrs que si vous utilisez une louable fournisseur pour votre robustesse cryptographique de nombres aléatoires, puis il va être la robustesse cryptographique, et la probabilité de répétitions sera le même que pour un idéal (non biaisée) générateur de nombre aléatoire.

Toutefois, si vous deviez utiliser une JVM avec un "cassé" crypto - générateur de nombres aléatoires, tous les paris sont éteints. (Et qui pourrait inclure certaines des solutions de contournement pour le "manque de l'entropie" des problèmes sur certains systèmes. Ou la possibilité que quelqu'un a bricolé avec votre JRE, que ce soit sur votre système ou en amont.)

21voto

sfussenegger Points 16204

Je ne suis pas un expert, mais je suppose que suffisamment de gens intelligents regardé Java du générateur de nombre aléatoire au fil des ans. Donc, je voudrais aussi supposer qu'aléatoire Uuid sont bonnes. Donc, vous devriez vraiment avoir théorique de la probabilité de collision (qui est d'environ 1 : 3 × 10^38 pour tous les Uuid. Quelqu'un sait comment cela change random Uuid? Est-il 1/(16*4) de la ci-dessus?)

De mon expérience pratique, je n'ai jamais vu aucun des collisions jusqu'à présent. Je vais probablement avoir enregistré une croissance étonnamment longue barbe le jour, je reçois mon premier ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X