【发布时间】:2011-08-14 15:19:22
【问题描述】:
它们是有点随机的吗?
我的意思是....人们能把它们分开吗?
【问题讨论】:
标签: mongodb
它们是有点随机的吗?
我的意思是....人们能把它们分开吗?
【问题讨论】:
标签: mongodb
它们通常由驱动程序本身在客户端生成。例如,在 ruby 中,可以使用 BSON::ObjectID:
您还可以生成自己的 ObjectId。如果您想使用业务标识符,这将特别有用。
【讨论】:
它们不是随机的,很容易预测:
BSON ObjectID 是一个 12 字节的值 由一个 4 字节的时间戳组成 (自纪元以来的秒数),一个 3 字节 机器 id、一个 2 字节的进程 id 和一个 3字节计数器
【讨论】:
这是 MongoDB ObjectID (http://jsfiddle.net/icodeforlove/rN3zb/) 的 javascript 实现
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:你有多少台服务器,每台服务器运行多少进程。
【讨论】:
默认情况下,MongoDB 数据库驱动程序会生成一个 ObjectID 标识符,该标识符分配给每个文档的 _id 字段。在许多情况下,ObjectID 可以用作应用程序中的唯一标识符。
ObjectID 是一个 96 位的数字,其组成如下:
一个 4 字节的值,表示自 Unix 纪元以来的秒数(直到 2106 年才会用完秒数)
一个 3 字节的机器标识符(通常来自 MAC 地址),
一个 2 字节的进程 ID,并且
一个 3 字节的计数器,从一个随机值开始。
【讨论】:
来自MongoDB官方文档links
它显示:
对象ID
ObjectId 很小,可能是唯一的,生成速度快,并且 订购。 ObjectId 值由 12 个字节组成,其中前四个 bytes 是反映 ObjectId 创建的时间戳。 具体来说:一个 4 字节的值,表示自 Unix 纪元以来的秒数,
一种 5字节随机值,
一个 3 字节的计数器,以随机数开始 价值。
在 MongoDB 中,存储在集合中的每个文档都需要一个 充当主键的唯一 _id 字段。如果插入的文档 省略 _id 字段,MongoDB 驱动程序会自动生成一个 _id 字段的 ObjectId。
【讨论】: