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를 자동으로 생성합니다.
총 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
'IT' 카테고리의 다른 글
프로젝트에서 엔티티 프레임워크의 최신 버전을 참조하고 있습니다... - 오류 (0) | 2023.07.02 |
---|---|
Heroku에서 Node.js 앱을 만들 때 Git에 "node_modules" 폴더를 체크인해야 합니까? (0) | 2023.07.02 |
model.find()가 mongoose에서 비어 있음을 반환합니다. (0) | 2023.06.27 |
긴 줄에 gitdiff를 어떻게 사용해야 합니까? (0) | 2023.06.27 |
.git 폴더를 추적할 파일 외부에 저장할 수 있습니까? (0) | 2023.06.27 |