2017-10-08 6 views
1

Ich bin auf der Suche nach einer effizienten Möglichkeit zum Erstellen von UUIDs in der Basis 64 mit einer Länge von 16 Zeichen. Jede ID muss zwingend zufällig sein, damit Sie die anderen IDs nicht vorhersagen können.16 Zeichen Eindeutige ID mit MongoDB + NodeJS

Auch ich bin mir nicht sicher, wie man überprüft, ob eine Kollision passiert, wie ich auf eine effiziente Weise nach ihnen suchen kann. Ich benutze eine MongoDB und als Server Node JS.

Ein Beispiel: Ich rufe die Funktion auf 1.000.000 Schlüssel zu erstellen und in der Datenbank sind bereits Millionen von Schlüsseln gespeichert. Wie kann ich garantieren, dass jeder Schlüssel nur ein Schlüssel ist, ohne dass jeder Schlüssel mit den vorhandenen Schlüsseln in der Datenbank verglichen wird?

Ich hoffe, jemand kann mir helfen. Thanks :)

+1

Was hast du probiert? Haben Sie versucht, mit 'crypto.js' eine zufällige 64er-Zahl zu generieren und den UUID-Index in mongoDB eindeutig zu machen? Auch Ihre Frage ist unklar, wollen Sie eine bessere zufällige Funktion oder eine bessere Möglichkeit zu überprüfen, ob die UUID bereits in der DB ist? Wenn es indiziert ist, wird es nicht gegen jeden anderen Schlüssel in der Datenbank überprüft. – Cristy

Antwort

0

Wie für eine solche ID zu erzeugen, wie wir wissen, Base64-Codierung etwa 1/3 größer als die ursprüngliche binäre ist, können wir nur 12 Byte der Zufallsdaten erzeugen, dann kodieren:

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)); 

Ich bin kein MongoDB-Experte, aber ich bin mir ziemlich sicher, dass es eindeutige Indizes hat, also versuchen Sie einfach, ein Dokument mit der gleichen ID wie zuvor zu erstellen, und es würde fehlschlagen.

+0

nur, wenn die ID als Objekt-ID verwendet wurde, andernfalls müssen Sie manuell einen eindeutigen Index für dieses Feld hinzufügen. –

+0

Ja, die UUIDs wären die Objekt-IDs. Wenn ich diese Schlüssel bulk.insert() und einen "doppelten Schlüsselfehler" bekomme, würde der Rest überhaupt eingefügt? Und würde ich die Anzahl oder den Namen dieser Duplikate bekommen? –