web-dev-qa-db-fra.com

Quelle version d'UUID utiliser?

Quelle version de l'UUID devez-vous utiliser? J'ai vu beaucoup de discussions expliquer ce que chaque version implique, mais j'ai du mal à déterminer ce qui convient le mieux à quelles applications.

275
user1802143

Il existe deux manières différentes de générer un UUID.

Si vous avez juste besoin d'un identifiant unique, vous voulez une version 1 ou 4.

  • Version 1: Ceci génère un identifiant unique basé sur l'adresse MAC de la carte réseau et une minuterie. Ces identifiants sont faciles à prédire (je peux peut-être en deviner un autre, si l'on en a un) et peuvent être retracés jusqu'à votre carte réseau. Il n'est pas recommandé de les créer.

  • Version 4: Ils sont générés à partir de nombres aléatoires (ou pseudo-aléatoires). Si vous avez juste besoin de générer un UUID, c'est probablement ce que vous voulez.

Si vous devez toujours générer le même UUID à partir d'un nom donné, vous voulez une version 3 ou 5.

  • Version 3: Ceci génère un identifiant unique à partir d'un hachage MD5 d'un espace de noms et d'un nom. Si vous avez besoin d'une compatibilité ascendante (avec un autre système générant des UUID à partir de noms), utilisez ceci.

  • Version 5: Ceci génère un identifiant unique à partir d'un hachage SHA-1 d'un espace de noms et d'un nom. Ceci est la version préférée.

338
Gabe

Si vous voulez un nombre aléatoire, utilisez une bibliothèque de nombres aléatoires. Si vous voulez un identifiant unique avec effectivement 0,00 ... beaucoup plus de 0 ici ... 001% de chance de collision, vous devez utiliser UUIDv1. Voir le post de Nick pour UUIDv3 et v5.

UUIDv1 n'est PAS sécurisé. Ce n'est pas censé être. Il est censé être UNIQUE et non imprévisible. UUIDv1 utilise l'horodatage actuel, un identifiant de machine, ainsi que des éléments aléatoires pour créer un nombre qui ne sera plus jamais généré par cet algorithme. Ceci est approprié pour un identifiant de transaction (même si tout le monde effectue des millions de transactions/s).

Pour être honnête, je ne comprends pas pourquoi UUIDv4 existe ... de la lecture RFC4122 , il semble que cette version n’élimine PAS les risques de collision. C'est juste un générateur de nombres aléatoires. Si cela est vrai, vous avez une très bonne chance que deux machines dans le monde créent éventuellement le même "UUID" v4 (guillemets car il n’existe pas de mécanisme permettant de garantir la confidentialité de U.niversal). Dans cette situation, je ne pense pas que cet algorithme fasse partie d'une RFC décrivant des méthodes permettant de générer des valeurs uniques. Il appartiendrait à un RFC de générer de l’aléatoire. Pour un ensemble de nombres aléatoires:

chance_of_collision = 1 - (set_size! / (set_size - tries)!) / (set_size ^ tries)
43
anregen

C'est une question très générale. Une réponse est: "cela dépend du type d’UUID que vous souhaitez générer". Mais un meilleur est celui-ci: "Avant de répondre, pouvez-vous nous dire pourquoi vous devez coder votre propre algorithme de génération d'UUID au lieu d'appeler la fonctionnalité de génération d'UUID fournie par la plupart des systèmes d'exploitation modernes?"

Faire cela est plus facile et plus sûr, et puisque vous n'avez probablement pas besoin de pour générer le vôtre, pourquoi vous embêter à coder une implémentation? Dans ce cas, la réponse devient utiliser tout ce que votre système d'exploitation, votre langage de programmation ou votre infrastructure fournit. Par exemple, dans Windows, il existe CoCreateGuid ou idCreate ou l'un des divers wrappers disponibles dans les nombreux frameworks utilisés. Sous Linux, il y a id_generate .

Si, pour une raison quelconque, vous devez absolument générer le vôtre, vous avez au moins le bon sens de éviter de générer des UUID v1 et v2. Il est difficile de les obtenir. Utilisez plutôt des UUID v3, v4 ou v5.

Mise à jour : Dans un commentaire, vous indiquez que vous utilisez Python et que vous créez un lien vers this . En regardant à travers l'interface fournie, l'option la plus simple consisterait à générer un UUID v4 (c'est-à-dire créé à partir de données aléatoires) en appelant uuid.uuid4().

Si vous avez des données dont vous avez besoin (ou pouvez) hachage pour générer un UUID, vous pouvez utiliser v3 (qui repose sur MD5) ou v5 (qui s'appuie sur SHA1). Générer un UUID v3 ou v5 est simple: commencez par choisir le type d’UUID que vous voulez générer (vous devriez probablement choisir v5), puis choisissez l’espace de nom approprié et appelez la fonction avec les données que vous souhaitez utiliser pour générer l’UUID. Par exemple, si vous hachez une URL, vous utiliserez NAMESPACE_URL:

uuid.uuid3(uuid.NAMESPACE_URL, 'https://ripple.com')

Veuillez noter que cet UUID sera différent de l'UUID v5 pour la même URL, qui est générée comme suit:

uuid.uuid5(uuid.NAMESPACE_URL, 'https://ripple.com')

Une propriété intéressante des URL v3 et v5 est qu'elles doivent être interopérables entre les implémentations. En d'autres termes, si deux systèmes différents utilisent une implémentation conforme à la RFC4122, ils vont (ou au moins devrait ) générer le même UUID si toutes les autres choses sont égales (c'est-à-dire générer la même version UUID, avec le même espace de noms et les mêmes données). Cette propriété peut être très utile dans dans certaines situations (en particulier dans les scénarios de stockage à contenu adressable), mais peut-être pas dans votre cas particulier.

15
Nik Bougalis

Documentation Postgres décrit les différences entre UUIDs. Un couple d'entre eux:

V3:

uuid_generate_v3(namespace uuid, name text) - Cette fonction génère un UUID de version 3 dans l'espace de nom donné en utilisant le nom d'entrée spécifié.

V4:

uuid_generate_v4 - Cette fonction génère un UUID de version 4, entièrement dérivé de nombres aléatoires.

0
Eugen Konkov