티스토리 뷰

WEB2.0/프로그래밍

mongodb ObjectId 파헤치기

나를찾는아이 2022. 6. 29. 12:25
728x90
반응형

https://www.mongodb.com/docs/manual/reference/method/ObjectId/

 

ObjectId — MongoDB Manual

Docs Home → MongoDB ManualObjectId( )Returns a new ObjectId. The 12-byte ObjectId consists of:A 4-byte timestamp, representing the ObjectId's creation, measured in seconds since the Unix epoch.A 5-byte random value generated once per process. This random

www.mongodb.com

 

mongodb는 ObjectId라는 GUID 체계를 사용하고 있습니다

ObjectId는 총 12바이트로 구성이 되어있는데

 

4바이트는 유닉스 타임스탬프
5바이트는 프로세스별로 한번 생성되는 랜덤한 값
3바이트는 자동증가하는카운터

이렇게 구성이 되어있습니다

 

mongodb console에서

 

ObjectId().str

 

을 입력하면

아래와같이 24글자의 string이 리턴됩니다

 

62b65f304e0c4bc668968f95

 

mongodb를 사용한다면 익숙하게 생긴 값입니다

 

이는 mongodb objectId를 구성하는 12byte의 값이 헥사형태로 표현된 것입니다

1byte는 8bit죠, 2^8은 256이니깐, 16*16 으로 256을 표현할수 있기 때문에

16진수 2글자로 1byte가 표현됩니다

그래서 총 12byte를 헥사로 표현할때 24개의 문자열로 표현이 되는것이지요

그럼 한번 이 문자열을 쪼개서 진짜 맞는지 확인해보겠습니다

const ObjectId = require("mongodb").ObjectId;

for (let i = 0; i < 3; i++) {
  const newObjectId = new ObjectId();
  let ctr = 0;

  const id = newObjectId.toString();

  var timestamp = id.slice(ctr, (ctr += 8));
  var machineID = id.slice(ctr, (ctr += 6));
  var processID = id.slice(ctr, (ctr += 4));
  var counter = id.slice(ctr, (ctr += 6));

  console.log("===========");

  console.log("id:", id);
  console.log("timestamp:", timestamp);
  console.log("machineID:", machineID);
  console.log("processID:", processID);
  console.log("counter:", counter);

  console.log("timestamp:", parseInt(timestamp, 16));
  console.log("machineID:", parseInt(machineID, 16));
  console.log("processID:", parseInt(processID, 16));
  console.log("counter:", parseInt(counter, 16));

  console.log("timstamp:", newObjectId.getTimestamp().getTime() / 1000);

  console.log("===========");
}

 

 

샘플코드입니다

 

id: 62b669348b1da528dc9f8967
timestamp: 62b66934
machineID: 8b1da5
processID: 28dc
counter: 9f8967
timestamp: 1656121652
machineID: 9117093
processID: 10460
counter: 10455399
timstamp: 1656121652

 

실행하면 이와 같은 결과가 나타나는데

 

동일한 머신, 동일한 프로세스에서 실행하는 경우 machine ID와 process ID는 항상 같은 값을 리턴하고

 

counter 값이 계속 증가합니다

 

timestamp는 당연히 생성된 시간을 나타내구요

 

 

 

이러한 구조로 mongodb는 sortable한 GUID로 사용가능한 objectId를 만들고 있습니다

 

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함