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个字节
    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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容