2017-10-08 4 views
1

길이가 16자인 기본 64의 UUID를 효율적으로 생성 할 수있는 방법을 찾고 있습니다. 모든 ID는 무작위로 작성되어야하므로 다른 ID를 예측할 수 없습니다.16 MongoDB + NodeJS의 문자 고유 ID

또한 충돌이 발생하는지 확인하는 방법을 잘 모르겠습니다. 어떻게 효율적으로 찾을 수 있습니까? mongoDB를 사용하고 서버 노드 JS로 사용하고 있습니다.

예 : 나는 1.000.000 키를 생성하는 함수를 호출하고 데이터베이스에는 이미 수백만 개의 키가 저장되어 있습니다. 모든 키가 데이터베이스의 기존 키와 모든 키를 비교하는 기존 키만 존재 함을 어떻게 보장 할 수 있습니까?

누군가가 나를 도울 수 있기를 바랍니다. 감사합니다 :) 우리가 Base64 인코딩 아는 한, 같은 ID를 생성에 관해서는

+1

무엇을 시도 했습니까? 'crypto.js'를 사용하여 임의의 기본 64 숫자를 생성하고 mongoDB에서 uuid 색인을 고유하게 만들려고 했습니까? 또한, 귀하의 질문은 명확하지 않다, 당신은 더 나은 임의의 기능이나 UUID가 이미 DB에 있는지 확인하는 더 나은 방법을 원하십니까? 인덱싱 된 경우 db의 다른 모든 키와 비교하여 검사되지 않습니다. ID가 objectID로 사용 된 경우에만 – 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

으로 변경하십시오. 그렇지 않으면 수동으로 고유 한 색인을 추가해야합니다. –

+0

예 UUID는 objectID입니다. 만약 내가 bulk.insert() 그 열쇠와 "중복 키 오류", 나머지 어쨌든 삽입 될까요? 그리고 그 사본의 개수 나 이름을 얻을 수 있습니까? –