mongodb的ObjectId最后三个字节有趣的地方
ObjectId 由12个字节组成,其中组成如下:
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
前4个字节为以秒为单位的时间戳
中间5个字节为随机字符串
最后3个字节是一个随机数,并且递增
3个字节24位,也就是1秒内生成2的24次,即16777216个不重复的ObjectId。
但是请看文档中的描述,incrementing counter, initialized to a random value
当时我看到这里就想,为什么不能从0开始呢,比如某一秒的第一个 ObjectId 是5ebc0b522d5c8f0c0c【000000】
,接着是5ebc0b522d5c8f0c0c【000001】
、5ebc0b522d5c8f0c0c【000002】
... 一直到最大值,然后下一秒,又是从【000000】开始。
因为如果使用随机数,那么有可能某一秒的第一个 ObjectId 是5ebc0b522d5c8f0c0c【fffffe】
,那接下来这一秒还需要生成 ObjectId,岂不是溢出了,不能用了?
后来实验了一下,发现不是我想象的那样。
在 shell 中执行 db.foo.insertOne({ t: "t" })
,发现随机数的递增与时间戳无关,也就是当前连接第一次生成随机数后,后面执行的操作都会使用这个随机数递增,而不会生成另一个随机数。
第一次执行,生成ObjectId如 {这一秒的时间戳}{随机字符串}28c060
下一个ObjectId => {这一秒的时间戳}{随机字符串}28c061
下一个ObjectId => {这一秒的时间戳}{随机字符串}28c062
......
一直到最大值,然后再从 000000 开始算起
所以 mongodb 确实是能在1秒内生成不重复的16777216个ObjectId
注意,随机字符串在同一个 shell 连接中是相同的。
插个题外话:mongodb从3.4版本开始,中间5个字节就已经改为随机字符串了,而不是3个字节表示机器标识码+2个字节表示进程号。至于为什么,官网没说,可以看其他开发者的猜想
mongodb的ObjectId最后三个字节有趣的地方的更多相关文章
- MongoDB中ObjectId的误区,以及引起的一系列问题
近期对两个应用进行改造,在上线过程中出现一系列问题(其中一部分是由于ObjectId误区导致的) 先来了解下ObjectId: TimeStamp 前 4位是一个unix的时间戳,是一个int类别,我 ...
- [MongoDB]MongoDB的ObjectId组成
一.ObjectId的组成首先通过终端命令行,向mongodb的collection中插入一条不带“_id”的记录.然后,通过查询刚插入的数据,发现自动生成了一个objectId“5e4fa350b6 ...
- 在UTF-8中,一个汉字为什么需要三个字节?
UNICODE是万能编码,包含了所有符号的编码,它规定了所有符号在计算机底层的二进制的表示顺序.有关Unicode为什么会出现就不叙述了,Unicode是针对所有计算机的使用者定义一套统一的编码规范, ...
- 请问utf-8的中文是一个汉字占三个字节长度吗?
这是个好问题,可以当作一个笔试题.先从字符编码讲起. 1.美国人首先对其英文字符进行了编码,也就是最早的ascii码,用一个字节的低7位来表示英文的128个字符,高1位统一为0: 2.后来欧洲人发现尼 ...
- 搭建高可用mongodb集群(三)—— 深入副本集内部机制
在上一篇文章<搭建高可用mongodb集群(二)—— 副本集> 介绍了副本集的配置,这篇文章深入研究一下副本集的内部机制.还是带着副本集的问题来看吧! 副本集故障转移,主节点是如何选举的? ...
- 字符集之在UTF-8中,一个汉字为什么需要三个字节?
(一)在UTF-8中,一个汉字为什么需要三个字节? UNICODE是万能编码,包含了所有符号的编码,它规定了所有符号在计算机底层的二进制的表示顺序.有关Unicode为什么会出现就不叙述了,Unico ...
- lua去掉字符串中的UTF-8的BOM三个字节
废话不多说,还是先说点吧,项目中lua读取的text文件如果有BOM,客户端解析就会报错,所以我看了看,任务编辑器swGameTaskEditor 在写入文件的时候,也不知道为什么有的文件就是UTF- ...
- 在UTF-8中,一个汉字为什么需要三个字节?(转)
http://www.cnblogs.com/web21/p/6092414.html UNICODE是万能编码,包含了所有符号的编码,它规定了所有符号在计算机底层的二进制的表示顺序.有关Unicod ...
- 搭建高可用mongodb集群(三)—— 深入副本集内部机制
在上一篇文章<搭建高可用mongodb集群(二)-- 副本集> 介绍了副本集的配置,这篇文章深入研究一下副本集的内部机制.还是带着副本集的问题来看吧! 副本集故障转移,主节点是如何选举的? ...
随机推荐
- UVA11384正整数序列(把123..变成0的最小步数)
题意: 给定一个正整数n,你的任务是最少的操作次数把序列1 2 3 4 5...n中所有的数字都变成0,每次操作可以从序列中选择一个活多个整数,同时减去一个相同的正整数,比如 1 2 3可以 ...
- Windows中的用户和组以及用户密码处理
目录 用户帐户 Windows 默认账户 Windows 内置用户账户 查看.创建和删除账户 组账户 内置组账户 组的查看.创建和删除 Windows中对用户密码的处理 LM-hash NTLM-ha ...
- 前端Excel表格导入导出,包括合并单元格,表格自定义样式等
表格数据导入 读取导入Excel表格数据这里采用的是 xlsx 插件 npm i xlsx 读取excel需要通过 XLSX.read(data, {type: type}) 方法来实现,返回一个叫W ...
- oo——第三单元总结
前言 第三单元是我们学习oo以来第一次接触JML.这一单元的三次作业和以前一样,采用了难度递进的方式,而且前一次作业的设计思路在下一次作业都多多少少有些体现(或者说是在其基础上做出的改进).而且本单元 ...
- 基于pyqt5和openpyxl和Pyinstaller的青年大学习检查未学习人数的脚本
前几天接到团支书的一个需求,因为学校给的名单是青年大学习已学习的名单,然而要知道未学习的名单只能从所有团员中再排查一次,过程相当麻烦.团支书跟我抱怨后,刚好我也学过一些操作办公软件的基础.打包pyth ...
- 前端Node的实用方法
Node 一.什么是Node Node是以基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动.非阻塞式I/O模型(I/O是 input/output的缩写,即输入输出端口,在 ...
- [Java] Tomcat 部署
背景 免费web服务器,Apache组织发布,Sun公司开发 基于Java,平台无关 可部署Web应用,为客户端提供服务 使用 启动 运行 \tomcat\bin\startup.bat 出现&quo ...
- [刷题] 19 Remove Nth Node From End of List
要求 给定一个链表,删除倒数第n个节点 示例 1->2->3->4->5->NULL , n=2 1->2->3->5 边界 n是从0还是从1计 n不合 ...
- 统一UOS操作系统 修改源地址
统一UOS操作系统 修改源地址 问题: 执行apt-get update的时候提示: root@sugon-PC:/etc/apt# apt-get update -y错误:1 https://uos ...
- Debian 9.4 多网卡链路聚合bond配置
Debian 9.4 多网卡链路聚合bond配置 安装ifenslave ifenslave 的作用是网卡的负载均衡 root@debian:~# apt-get install ifenslave ...