mongodb id的用途在分布式存储上作为全局唯一id使用;
mogodb转为其他数据库,比如pgsql时,沿用原先的id规则;
需要隐藏真实数量的地方,比如用mysql存储用户,其自增id很容易看出用户数量;
防止某种形式的机器攻击,比如根据mysql、pgsql等自增id很容易通过机器生成url,在做采集时很方便。
mongodb的生成规则
mongodb根据版本不同,生成规则有部分调整,不同的地方在中间的10位(5 byte)。根据mongodb的文档,在mongodb3.2以下的ObjectId生成规则:8位的时间戳 + 6位的机器标志 + 4位的进程id + 6位的自增计数a 4-byte value representing the seconds since the Unix epoch,
a 3-byte machine identifier,
a 2-byte process id, and
a 3-byte counter, starting with a random value.
mongodb3.4及以上的版本的ObjectId生成规则:8位的时间戳 + 10位的随机码 + 6位的自增计数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
PHP生成mongodb id
下列算法是mongodb3.2之前的ObjectId生成算法,来自于网上,参考注释部分
下列php代码用于生成mongodb3.4级以上版本的ObjectId
golang生成mongodb ObjectId注意:go playground中生成mongodb3.4以上版本的id每次都一样,经观察应该是随机数生成一致的原因,本人本机测试没问题。
基准测试结果
小结实际上我自己使用时,传入的参数是用到这个id的表的名称,而lastId则通过内存缓存存储,每次要用的时候从缓存获取并加一。