264 votes

Quand dois-je utiliser uuid.uuid1() vs uuid.uuid4() en python ?

Je comprends les différences entre les deux, de la docs.

uuid1():
Générer un UUID à partir d'un ID d'hôte, le numéro de séquence, et à l'heure actuelle

uuid4():
La génération aléatoire d'UUID.

Donc, uuid1 utilise la machine/séquence/informations en temps pour générer un UUID. Quels sont les avantages et les inconvénients de l'utilisation de chacune?

Je connais uuid1() peut avoir des problèmes de confidentialité, car il est basé sur la machine de l'information. Je me demande si il y a de plus subtil lors du choix de l'un ou de l'autre. Je viens de l'utiliser uuid4() maintenant, puisque c'est totalement aléatoire UUID. Mais je me demande si je devrais être à l'aide de uuid1 afin de réduire le risque de collisions.

En gros, je suis à la recherche pour les personnes de conseils pour les meilleures pratiques sur l'utilisation de l'un contre l'autre. Merci!

307voto

Georg Schölly Points 63123

uuid1() est garanti pour ne pas produire toutes collisions (sous l'hypothèse que vous n'avez pas créer un trop grand nombre d'entre eux en même temps). Je ne voudrais pas l'utiliser s'il est important qu'il n'y a pas de lien entre l' uuid et de l'ordinateur, comme l'adresse mac est utilisée pour le rendre unique à travers les ordinateurs.

Vous pouvez créer des doublons par la création de plus de 214 uuid1 en moins de 100 ns, mais ce n'est pas un problème pour la plupart des cas d'utilisation.

uuid4() génère, comme vous l'avez dit, un hasard UUID. La probabilité d'une collision est vraiment, vraiment, vraiment petit. D'assez petite taille, que vous ne devriez pas vous inquiéter à ce sujet. Le problème, c'est qu'un mauvais générateur de nombres aléatoires rend plus susceptibles d'avoir des collisions.

Cette excellente réponse de Bob Aman , il résume très bien l'affaire. (Je recommande la lecture de l'ensemble de la réponse.)

Franchement, en un seul espace d'application sans les acteurs malveillants, les l'extinction de toute vie sur terre se produisent de temps avant que vous avez un collision, même sur une version 4 UUID, même si vous êtes à la production un peu Uuid par seconde.

39voto

mjv Points 38081

Un exemple, vous pouvez envisager uuid1() plutôt que d' uuid4() est quand Uuid sont fabriqués sur des machines distinctes, par exemple lorsque plusieurs transactions en ligne sont des processus sur plusieurs machines pour la mise à l'échelle des fins.

Dans une telle situation, le risque de collisions dues à de mauvais choix dans la façon dont le pseudo-générateurs de nombres aléatoires sont initialisé, par exemple, et aussi potentiellement un plus grand nombre de Uuid produit de rendre plus probable la possibilité de créer des Id en double.

Un autre intérêt de l' uuid1(), dans ce cas, c'est que la machine où chaque GUID a été initialement produite est implicitement enregistré (dans le "nœud" de l'UUID). Le présent et l'heure de l'info, peut aider si seulement le débogage.

10voto

Guillaume Points 16

Une chose à noter lorsque vous utilisez , si vous utilisez l’appel par défaut (sans donner paramètre) vous avez une chance de tomber sur des collisions : vous avez seulement 14 bits de hasard (générant 18 entrées dans 100 ns donne vous environ 1 % de chance de collision voir anniversaire paradoxe/attaque). Le problème ne se produira jamais plus souvent usage, mais sur une machine virtuelle avec une résolution de l’horloge pauvre il vous mordra.

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