2017-10-08 90 views
1

我在尋找一種有效的方式,以具有16個字符的長度在創建底座64的UUID。每個ID都必須是隨機的,所以你不能預測其他ID。16字符的唯一ID與MongoDB的+的NodeJS

而且我不知道如何檢查,如果發生碰撞,我怎麼能期待他們在efficent方式。我正在使用mongoDB並作爲服務器節點JS。

一個例子: 我調用函數來創建1.000.000鍵並在數據庫中已經數以百萬計的鍵保存。我怎樣才能保證每一個密鑰都只存在於沒有將每個密鑰與數據庫中現有密鑰進行比較的密鑰?

我希望有人能幫助我。謝謝:)

+1

你嘗試過什麼?你有沒有試過使用'crypto.js'生成一個隨機基數爲64的數字,並使uongid索引在mongoDB中唯一?另外,你的問題還不清楚,你想要一個更好的隨機函數或更好的方法來檢查uuid是否已經在數據庫中?如果它被編入索引,它將不會與數據庫中的所有其他密鑰進行檢查。 – Cristy

回答

0

作爲產生這樣的ID,因爲我們知道Base64編碼是大約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添加一個文件作爲之前存在的一個,它會失敗。

+0

只有當ID已被用作的objectID,否則,您必須對申請手動添加唯一索引。 –

+0

是的,UUID將是對象ID。如果我將bulk.insert()這些鍵並獲得「重複鍵錯誤」,其餘的將被插入嗎?我會得到這些重複的計數或名稱? –