评论

云开发数据库id生成规则探究

从id提取时间戳

最近考虑做一个简单的冷热数据分离的数据库,按年份划分数据库。读取的时候,需要根据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,没办法验证其它字符串的含义,希望官方可以解答一下。

最后一次编辑于  2022-02-19  
点赞 0
收藏
评论

2 个评论

  • 陈金燊
    陈金燊
    2023-10-16

    时间戳为啥不放在首位


    2023-10-16
    赞同
    回复
  • 飞来去
    飞来去
    2023-10-13

    很好

    2023-10-13
    赞同
    回复
登录 后发表内容