最近考虑做一个简单的冷热数据分离的数据库,按年份划分数据库。读取的时候,需要根据id确定该记录在哪个年份的数据库。现在记录的id都是自动生成的,查阅开发文档,没找到id的生成规则,遂开始探究。
亲兄弟MongoDB
云开发数据库据说是基于MongoDB开发,生成规则可能和MongoDB类似。
MongoDB的id采用12字节的存储空间,每个字节2位16进制数字,是一个24位的字符串
00 00 00 00 | 00 00 00 | 00 00 | 00 00 00 |
---|---|---|---|
时间戳(秒级) | 机器码 | PID | 计数器 |
云开发数据库的id是36位的,不完全相同,不过可以根据这个思路找到时间戳。
实测
生成几个id观察一下
54ad1eea620fb1d9114b551e6c207cdb
54ad1eea620fb1d9114b551f672b11cc
54ad1eea620fb1e7114b56cd102a7a0b
54ad1eea620fb1e7114b56ce37f223c2
17e3426e620fb2930f4a586a4203d6b3
17e3426e620fb2930f4a586b4b398ee1
41ae62ef620fb331073ed14d32a213a6
41ae62ef620fb331073ed14e0775285a
41ae62ef620fc69b07416db55dbb0fba
41ae62ef620fc69b07416db662883e37
54ad1eea620fc69b114deb116e73109e
54ad1eea620fc69b114deb12221c26b1
以上记录都在同一个集合里,每组都是同一时间生成。简单观察一下发现,第9~16位是16进制的时间戳
54ad1eea 620fb1d9 114b551e6c207cdb
54ad1eea 620fb1d9 114b551f672b11cc
620fb1d9 => 1645195737
54ad1eea 620fb1e7 114b56cd102a7a0b
54ad1eea 620fb1e7 114b56ce37f223c2
620fb1e7 => 1645195751
17e3426e 620fb293 0f4a586a4203d6b3
17e3426e 620fb293 0f4a586b4b398ee1
620fb293 => 1645195923
41ae62ef 620fb331 073ed14d32a213a6
41ae62ef 620fb331 073ed14e0775285a
620fb331 => 1645196081
41ae62ef 620fc69b 07416db55dbb0fba
41ae62ef 620fc69b 07416db662883e37
620fc69b => 1645201051
54ad1eea 620fc69b 114deb116e73109e
54ad1eea 620fc69b 114deb12221c26b1
620fc69b => 1645201051
问题迎刃而解,只要提取第9~16位字符串,再转换为十进制,就可以得到一个Unix时间戳。
可以看出云开发数据库的id生成规则和MongoDB类似,不过获取不了机器码和PID,没办法验证其它字符串的含义,希望官方可以解答一下。
时间戳为啥不放在首位
很好