Il s'agit de cette question . J'utilise le code ci-dessous à partir de cette réponse pour générer un UUID en JavaScript :
'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16);
});
Cette solution semblait fonctionner correctement, mais j'obtiens des collisions. Voici ce que j'ai :
- Une application web fonctionnant dans Google Chrome.
- 16 utilisateurs.
- environ 4000 UUIDs ont été générés au cours des deux derniers mois par ces utilisateurs.
- J'ai obtenu environ 20 collisions - par exemple, un nouvel UUID généré aujourd'hui était le même qu'il y a environ deux mois (utilisateur différent).
Quelle est la cause de ce problème et comment puis-je l'éviter ?
2 votes
Combine un bon nombre aléatoire avec le temps actuel (en millisecondes). Les chances que le nombre aléatoire entre en collision exactement au même moment sont vraiment, vraiment, vraiment faibles.
7 votes
@jfriend00 si vous devez faire cela alors ce n'est pas un "bon nombre aléatoire", pas même un nombre pseudo-aléatoire décent.
2 votes
Que fait le
(r&0x3|0x8)
partie signifie / évaluation à ?0 votes
Qu'en est-il de l'ajout d'un Date.now().toString() ?
4 votes
Il y a un gros problème dans votre architecture, sans rapport avec les UUIDs -- le client peut intentionnellement générer des IDs qui se chevauchent. Générer des IDs uniquement par un système de confiance. Comme solution de contournement, il est possible de faire précéder les identifiants générés par le client d'un user_id, de sorte que l'adversaire ou le client défaillant ne puisse entrer en collision qu'avec lui-même (et de gérer cela côté serveur).
0 votes
Que diriez-vous d'utiliser un timestamp pour brouiller les données lors de la génération des UUIDs (ex : en appelant new Date()) ? Cela permettrait-il de réduire les collisions sur Chrome ?