MongoDB ObjectId 源碼剖析

官方對 ObjectId 的描述:https://docs.mongodb.com/manual/reference/method/ObjectId/#objectid

  • a 4-byte timestamp value, representing the ObjectId's creation, measured in seconds since the Unix epoch
  • a 5-byte random value
  • a 3-byte incrementing counter, initialized to a random value

Golang 使用的客戶端為 https://github.com/mongodb/mongo-go-driver ,此文章使用的版本 v1.7.0

源碼為 go.mongodb.org/mongo-driver@v1.7.0/bson/primitive/objectid.go

func NewObjectID() ObjectID {
    return NewObjectIDFromTimestamp(time.Now())
}

// NewObjectIDFromTimestamp generates a new ObjectID based on the given time.
func NewObjectIDFromTimestamp(timestamp time.Time) ObjectID {
    var b [12]byte // 12個字節(jié)
    binary.BigEndian.PutUint32(b[0:4], uint32(timestamp.Unix())) // 前4個字節(jié)為時間戳
    copy(b[4:9], processUnique[:]) // "不變的"5字節(jié)隨機(jī)數(shù)
    putUint24(b[9:12], atomic.AddUint32(&objectIDCounter, 1)) // 動態(tài)變化的"不變的"3字節(jié)隨機(jī)數(shù)+1
    return b
}

隨機(jī)數(shù)就是預(yù)料之中的 /dev/urandom ,Go相關(guān)代碼為 go/src/crypto/rand/rand_unix.go

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容