2017-10-08 18 views
1

Je cherche un moyen efficace de créer des UUID en base 64 d'une longueur de 16 caractères. Chaque ID doit être aléatoire au hasard, donc vous ne pouvez pas prédire les autres ID.ID unique 16 caractères avec MongoDB + NodeJS

Aussi je ne sais pas comment vérifier si une collision se produit, comment je peux les rechercher d'une manière efficace. J'utilise un mongoDB et un serveur Node JS.

Un exemple: J'appelle la fonction pour créer 1.000.000 Keys et dans la base de données sont déjà des millions de clés enregistrées. Comment puis-je garantir que toutes les clés sont existantes sans comparer toutes les clés aux clés existantes dans la base de données?

J'espère que quelqu'un peut m'aider. Merci :)

+1

Qu'avez-vous essayé? Avez-vous essayé de générer un nombre de base 64 aléatoire avec 'crypto.js' et de rendre l'index uuid unique dans mongoDB? En outre, votre question n'est pas claire, voulez-vous une meilleure fonction aléatoire ou une meilleure façon de vérifier si l'uuid est déjà dans la base de données? Si elle est indexée, elle ne sera pas vérifiée par rapport à toutes les autres clés de la base de données. – Cristy

Répondre

0

Comme pour générer un tel ID, comme nous le savons encodage base64 est d'environ un tiers plus grand que le binaire d'origine, on peut simplement générer 12 octets de hasard, puis encoder:

const crypto = require('crypto'); 

function generateRandomID() { 
    return new Promise((res) => { 
     crypto.randomBytes(12, (err, buf) => { 
      if(err) throw err; 
      const enc = buf.toString('base64'); 
      if(enc.length !== 16) throw 'invalid'; 
      res(enc); 
     }); 
    }); 
} 

generateRandomID() 
    .then((id) => console.log(id)) 
    .catch((err) => console.log(err)); 

Je ne suis pas un expert de MongoDB, mais je suis sûr qu'il a des index uniques, donc vous essayez juste d'ajouter un document avec le même identifiant que celui qui existait auparavant, et il échouerait.

+0

uniquement si l'ID a été utilisé comme objectID, sinon vous devez ajouter manuellement un index unique sur ce fichier. –

+0

Oui, les UUID seraient les objectID. Si je voudrais bulk.insert() ces clés et obtenir une "erreur de clé en double", le reste serait-il inséré de toute façon? Et aurais-je le compte ou le nom de ces doublons? –