La Performance de l'Aléatoire de la génération d'UUID avec Java 7 ou Java 6
J'ai un basé sur le web application Java qui génère aléatoirement des Uuid pour les informations de session. L'un de nos testeurs réclame jusqu'à 350ms pour générer des Uuid basé sur son profilage, mais je n'ai pas encore été en mesure de reproduire ses résultats. Il souligne à cet article http://www.cowtowncoder.com/blog/archives/2010/10/entry_429.html pour aider à sauvegarder ses résultats. Je voulais voir si quelqu'un d'autre a couru dans cette limitation avec Java intégré dans l'UUID de la capacité de production dans la version 6 de Java ou Java 7 applications.
350ms pour générer des UUID? Comment est-il de la sauvegarde que l'article vous le lien?
Il est l'outil de profilage qu'il utilise. Je n'ai pas été capable de reproduire sur ma fin. C'est pourquoi j'ai voulu vérifier pour voir si il ya un problème similaire quelqu'un d'autre a vécu. Il pourrait être un problème avec un outil de profilage ou peut-être il être une étrange combinaison de Java avec l'environnement d'exécution. Il semblait étrange pour moi.
Encore une fois: Est-il prétendre qu'il faut 350ms pour générer des UUID (comme vous l'écrivez Uuid au pluriel, sans réellement spécifiant combien)? Comment est-il de la sauvegarde que l'article vous le lien? Il n'y a rien dans cet article ce qui suggère que le générateur d'UUID est si lent. Une autre question: quel système d'exploitation est le testeur de l'exécution de ce test? Java sur Linux utilise /dev/urandom générateur, qui peut être assez lent si il n'y a pas beaucoup d'activité (par exemple, la saisie de l'utilisateur ou d'un réseau de trafic) sur ce système.
La demande a été 350ms pour générer un seul UUID. Notre défaut systèmes Macbook pro sous Mountain Lion. Les systèmes de Production sont la dernière version de CentOS.
350ms? J'ai fait une en C qui génère de 400 000 Uuid un deuxième sur les nouveaux macbook pro. Mais ce n'est pas vraiment une comparaison équitable 😉
Il est l'outil de profilage qu'il utilise. Je n'ai pas été capable de reproduire sur ma fin. C'est pourquoi j'ai voulu vérifier pour voir si il ya un problème similaire quelqu'un d'autre a vécu. Il pourrait être un problème avec un outil de profilage ou peut-être il être une étrange combinaison de Java avec l'environnement d'exécution. Il semblait étrange pour moi.
Encore une fois: Est-il prétendre qu'il faut 350ms pour générer des UUID (comme vous l'écrivez Uuid au pluriel, sans réellement spécifiant combien)? Comment est-il de la sauvegarde que l'article vous le lien? Il n'y a rien dans cet article ce qui suggère que le générateur d'UUID est si lent. Une autre question: quel système d'exploitation est le testeur de l'exécution de ce test? Java sur Linux utilise /dev/urandom générateur, qui peut être assez lent si il n'y a pas beaucoup d'activité (par exemple, la saisie de l'utilisateur ou d'un réseau de trafic) sur ce système.
La demande a été 350ms pour générer un seul UUID. Notre défaut systèmes Macbook pro sous Mountain Lion. Les systèmes de Production sont la dernière version de CentOS.
350ms? J'ai fait une en C qui génère de 400 000 Uuid un deuxième sur les nouveaux macbook pro. Mais ce n'est pas vraiment une comparaison équitable 😉
OriginalL'auteur Shawn H | 2013-01-26
Vous devez vous connecter pour publier un commentaire.
Je l'ai testé
sur mon PC, il est ~1100 ms, ce qui est assez lent. UUID.randomUUID() utilise SecureRandom en interne, afin de le rendre plus rapide, nous pouvons utiliser java ordinaire.util.Aléatoire
c'est ~80 ms
Par moi-même la vitesse de ces deux méthodes est similaire, mais c'est la machine Windows.
Il utilise SecureRandom pour une raison, vous ne devriez pas "l'utilisation régulière de java.util.Au hasard", et ne pas attendre de l'UUID des affrontements.
Je ne suis pas sûr que votre raisonnement est correct. Je pense que le gros problème, c'est la prévisibilité, la pas de l'homogénéité. UUID peut être utilisé pour sécuriser les fins-comme un impossible à deviner clé--, qui requiert une haute qualité de l'entropie. Mais dans de nombreux cas, où le but est l'insécurité de l'évitement de collision, je crois que le
random.nextLong()
stratégie suffira.Comment sont uuid "trivialement bruteforced"? Envisager de 1 milliards d'euros, un deuxième pour les 30 ans de droite est d'environ 2^60, ce qui est inférieur à la racine carrée de l'uuid de l'espace, mais de nombreux de nombreux ordres de grandeur de plus que ce qui peut être attendu d'être peut-être généré par l'ensemble de la planète en ce moment, mais certainement dans une seule application. Pourriez-vous élaborer sur la façon dont vous vous sentez de type 4 uuid sont trivialement bruteforced?
OriginalL'auteur Evgeniy Dorofeev
Voici un essai en bêta 127.
Garder à l'esprit que ce test est irréaliste, au-delà de tout scénario du pire des cas je peux imaginer. Mon but était de calmer ceux qui, de mauvaise bouche de l'utilisation de UUIDs sans les faits, afin de sauvegarder leurs critiques.
Scénario:
java.util.UUID.randomUUID()
Sans Prétention
Exécution d'une boucle dans un thread, donc pas de contention sur la synchronisés méthodes/classes.
Résultats
Sur 2 microsecondes par UUID.
Avec Contention
Similaire à ci-dessus, mais tout en faisant une boucle d'un million d'appels, nous avons deux autres threads d'exécution où chacun fait dix millions d'appels.
Et la classe définissant chaque thread...
Résultats
Sur 20 microsecondes par UUID.
D'exécution ont été 14, 20, 20, 23, et 24 microsecondes par UUID (pas dans cet ordre). Donc dans des conditions extrêmes de contention n'était que d'environ 10 fois pire, avec 20 microsecondes étant acceptable dans aucun usage du monde réel, je l'ai connu.
nanos / 1000
, qui est micro secondes pas milli secondes.Corrigé, merci.
OriginalL'auteur Basil Bourque
L'aléatoire de la forme de l'UUID nécessite une source de "cryptographie force" de nombres aléatoires. (Si elle n'a pas alors il pourrait être la probabilité qu'un UUID est réédité pourrait augmenter à des niveaux inquiétants.)
Typique crypto-force générateurs de nombres aléatoires utiliser une source d'entropie qui est externe à l'application. Il pourrait être un matériel générateur de nombre aléatoire, mais le plus souvent, c'est le cumul des "hasard" qui est récolté par le système d'exploitation en fonctionnement normal. Le problème est que les sources d'entropie ont un taux limite. Si vous dépassez ce taux sur une période de temps, vous pouvez vider la source. Ce qui se passe ensuite est dépendante du système, mais sur certains systèmes, le syscall pour lire l'entropie va caler ... jusqu'à ce que plus est disponible.
J'attends qu'est ce qui se passe sur votre système du client.
Une solution de contournement (pour les systèmes Linux) est d'installer le
rngd
démon et de le configurer à "top up" l'entropie de la piscine à l'aide d'un générateur de nombres pseudo aléatoires. L'inconvénient est que cela pourrait compromettre votre UUID du générateur aléatoire.OriginalL'auteur Stephen C
Le nombre de threads a un impact énorme sur les performances de la génération de l'Uuid. Ceci peut être expliqué par la recherche à la mise en œuvre de
SecureRandom#nextBytes(byte[]
qui génère des nombres aléatoires pourUUID.randomUUID()
:nextBytes
estsynchronized
qui conduit à des pertes de performances lors de l'accès par les différents threads.OriginalL'auteur Peter Keller
Utiliser la Version 1 au Lieu de 4
Comment sur l'utilisation de la Version 1 de type UUID?
La Version 1 est basé sur Adresse MAC et temps actuel ("l'espace et le temps"). Beaucoup moins susceptibles d'avoir des collisions à la Version 4.
La Version 4 est basé sur entièrement générée à partir de nombres aléatoires à l'aide d'un cryptage fort générateur aléatoire.
La JVM Oracle ne fournit pas de Version 1 générateur, apparemment en raison de la sécurité et de confidentialité. La JVM ne pas fournir l'accès à l'adresse MAC de la machine hôte.
CRUCHE Bibliothèque
Il existe au moins un tiers de la bibliothèque disponible que le me fournir la Version 1 Uuid, ainsi que d'autres versions: CARAFE de Java Générateur d'UUID. Ils disent fonctionnalités introduites dans Java 6 de les laisser accéder à l'adresse MAC.
Résultats du Test: 20x
Lire une discussion de performance avec les résultats des tests à l'aide de Java Générateur d'UUID de la version 3 dans l'article paru en 2010, Plus sur Java Générateur d'UUID (CRUCHE), un mot sur la performance. Tatu Saloranta testé différents types de Uuid sur son MacBook.
Résultat: MAC+version est 20 fois plus rapide que l'aléatoire version.
OriginalL'auteur Basil Bourque
Un test junit exécuter sous jdk 1.7.0_40:
Et les résultats sur mon i5 ordinateur portable ont été:
0.0006770 ms par invocation.
UUID.randomUUID();
ligne que ses résultats n'est pas utilisé?OriginalL'auteur CorbaTheGeek
J'ai fait le même test que les autres et mes résultats sont plus de 300 Nanosecondes par l'UUID de la génération. Les résultats sont sur un i7 quad-core WIN7 64 PC. J'ai essayé avec un jdk1.7.0_67 et avec un jdk1.8.0_40 en 64 bits et Jvm.
Je suis un peu perplexe mes résultats sont tellement différent de tous les autres... Mais 1 ms pour générer un nombre aléatoire semblait BEAUCOUP !
La sortie :
OriginalL'auteur yannick1976