IT

MongoDB의 ObjectIds는 어떻게 생성됩니까?

itgroup 2023. 6. 27. 22:06
반응형

MongoDB의 ObjectIds는 어떻게 생성됩니까?

그들은 다소 무작위적인가요?

내 말은..사람들이 그들을 갈라놓을 수 있을까요?

랜덤하지 않으며 쉽게 예측할 수 있습니다.

BSON 객체ID는 4바이트 타임스탬프(epoch 이후 초), 3바이트 시스템 ID, 2바이트 프로세스 ID 및 3바이트 카운터로 구성된 12바이트 값입니다.

http://www.mongodb.org/display/DOCS/Object+IDs

MongoDB Object의 Javascript 구현입니다.아이디(http://jsfiddle.net/icodeforlove/rN3zb/)

function ObjectIdDetails (id) {
    return {
        seconds: parseInt(id.slice(0, 8), 16),
        machineIdentifier: parseInt(id.slice(8, 14), 16),
        processId: parseInt(id.slice(14, 18), 16),
        counter: parseInt(id.slice(18, 24), 16)
    };
}

따라서 이러한 정보가 충분하면 인프라스트럭처에 대한 정보가 상당히 많이 유출됩니다.또한 모든 것에 대한 개체 생성 날짜도 알 수 있습니다.

IE: 서버 수와 각 서버가 실행 중인 프로세스 수.

시대

일반적으로 드라이버 자체가 클라이언트 측에서 생성합니다.예를 들어 루비의 경우 BSON::Object사용할 수 있는 ID:

자체 ObjectId를 생성할 수도 있습니다.이 기능은 비즈니스 식별자를 사용하려는 경우 특히 유용합니다.

파괴성

  • 드라이버 생성 ObjectIds를 사용하는 경우 낮음
  • 자신의 비즈니스 ID를 사용하는 경우 예측 가능성(로그인, 연속 식별자 등)에 따라 약간 더 높습니다.

MongoDB 데이터베이스 드라이버는 기본적으로 개체를 생성합니다.각 문서의 _id 필드에 할당된 ID 식별자.대부분의 경우 객체ID는 응용 프로그램에서 고유 식별자로 사용될 수 있습니다.

ObjectID는 다음과 같이 구성된 96비트 숫자입니다.

유닉스 시대 이후의 초를 나타내는 4바이트 값(2106년까지 초가 부족하지 않음)

3바이트 시스템 식별자(일반적으로 MAC 주소에서 파생됨)

2바이트 프로세스 ID 및

임의의 값으로 시작하는 3바이트 카운터

MongoDB 공식 문서 링크
다음을 표시:

개체 ID
ObjectId는 작고 고유할 수 있으며 생성 속도가 빠르고 순서가 지정되어 있습니다.ObjectId 값은 12바이트로 구성되며, 여기서 처음 4바이트는 ObjectId 생성을 반영하는 타임스탬프입니다.구체적으로:

4바이트 값은 유닉스 시대 이후의 초를 나타냅니다.
값 및 5바이트 랜덤 값
임의의 값으로 시작하는 3바이트 카운터
MongoDB에서 컬렉션에 저장된 각 문서에는 기본 키 역할을 하는 고유한 _id 필드가 필요합니다.삽입된 문서에서 _id 필드를 생략하면 MongoDB 드라이버는 _id 필드에 대한 ObjectId를 자동으로 생성합니다.

MongoDB 데이터베이스 드라이버는 기본적으로 개체를 생성합니다.각 문서의 _id 필드에 할당된 ID 식별자.대부분의 경우 객체ID는 응용 프로그램에서 고유 식별자로 사용될 수 있습니다.

총 12바이트:

  • Unix epoch 이후의 초를 나타내는 4바이트 타임스탬프 값(2106년까지 초가 부족하지 않음)
  • 5바이트 랜덤 값
  • 임의의 값으로 시작하는 3바이트 증분 카운터입니다.

monggo-go-driver의 예:

    var objectId [12]byte

    // 4 bytes unix time-stamp second (big endian)
    binary.BigEndian.PutUint32(objectId[0:4], uint32(timestamp.Unix()))

    // global random number generated by driver 
    copy(objectId[4:9], processUnique[:])
    
    // global counter by driver
    putUint24(objectId[9:12], atomic.AddUint32(&objectIDCounter, 1))

언급URL : https://stackoverflow.com/questions/5817795/how-are-mongodbs-objectids-generated

반응형