2017-10-08 1 views
1

長さ16文字のベース64でUUIDを効率的に作成する方法を模索しています。あなたが他のIDを予測することができないように、すべてのIDはランダムである必要があります。16文字ユニークIDとMongoDB + NodeJS

また、衝突が発生したかどうかを確認する方法がわかりません。どのように効率的にそれらを探すことができますか。私はmongoDBを使用しており、サーバーNode JSとして使用しています。

例: 私は1.000.000キーを作成する関数を呼び出し、データベースにはすでに数百万のキーが保存されています。どのようにすべてのキーがデータベース内の既存のキーとすべてのキーを比較しているだけであることを保証することができますか?

誰かが私を助けてくれることを願っています。おかげ:)我々はBase64エンコード知っているように、そのようなIDを生成するように

+1

何を試しましたか? 'crypto.js'でランダムな64進数を生成しようとしましたが、uuidインデックスをmongoDBでユニークにしましたか?また、あなたの質問は不明です、あなたはより良いランダム関数またはuuidがすでにDBにあるかどうかを確認する良い方法が欲しいですか?索引付けされている場合、db内の他のすべてのキーと照合されることはありません。 – Cristy

答えて

0

が元のバイナリより約1/3大きく、我々は単にランダムの12のバイトを生成することができ、それをコード:

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

私はMongoDBの専門家ではありませんが、ユニークなインデックスを持っていると確信しています。既存のIDと同じIDを持つドキュメントを追加しようとすると失敗します。

+0

IDがobjectIDとして使用されている場合のみ、そうでない場合は、そのフィールドに一意のインデックスを手動で追加する必要があります。 –

+0

はい、UUIDはobjectIDです。私がbulk.insert()それらのキーを取得し、 "重複キーエラー"を得る場合、残りはとにかく挿入されますか?そして、私はその重複の数または名前を取得できますか? –

関連する問題