IT虾米网

MongoDB ObjectId 源码剖析详解

shasha 2021年08月19日 数据库 228 0
本文章主要介绍了MongoDB ObjectId 源码剖析,具有不错的的参考价值,希望对您有所帮助,如解说有误或未考虑完全的地方,请您留言指出,谢谢!

官方对 ObjectId 的描述:IT虾米网

  • 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 使用的客户端为 IT虾米网 ,此文章使用的版本 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个字节 
    binary.BigEndian.PutUint32(b[0:4], uint32(timestamp.Unix())) // 前4个字节为时间戳 
    copy(b[4:9], processUnique[:]) // "不变的"5字节随机数 
    putUint24(b[9:12], atomic.AddUint32(&objectIDCounter, 1)) // 动态变化的"不变的"3字节随机数+1 
    return b 
} 

随机数就是预料之中的 /dev/urandom ,Go相关代码为 go/src/crypto/rand/rand_unix.go


发布评论
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

fetch API 的基本使用详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。