软件生成唯一ID号(流水号)那些事

1. 历史

从软件发展以来,对某个业务功能生成唯一的流水号(通常是数字或字母混合)就成为一个必要的功能。

无论是一个单片机(MCU), 还是一台嵌入式Linux设备, 或是服务器,服务器集群。

在数据库里,这个ID经常被称为“主键”(Primary Key), 它是海量数据得以不乱掉的根本。

曾几何时,每次开发类似的软件,都要重新造一遍轮子,每个人的想法和算法都不一样,合作起来难免浪费工作量。

2. 原始和朴素的做法

  1. 进化阶段1

对于一台设备,最容易想到的就是根据时间戳来标识了,
比如生成格式为

  • 年月日时分秒

20200107102003 代表2020年1月7日10点20分03秒。

然而,一旦实用起来,发现以下的问题:
1) 如果1秒钟需要2个唯一ID怎么办?这样就重复了
2) 如果有多台设备同时按这个办法产生怎么办? 也难免在1秒钟内不产生多个。

  1. 进化阶段2

要解决1秒钟产生2个以上唯一ID这个问题,引入一个序列号概念,生成格式变成了

  • 年月日时分秒 + 流水号

只要流水号有几位,就够用了,比如5位,在1秒钟业务量不至于产生99999个这么多的ID号需求吧?

  1. 进化阶段3
    要解决多台设备的问题,这么办,再加几位,来代表设备号
  • 年月日时分秒 + 流水号 + 设备号

3. 现实

云服务器日渐流行,它的单机相比,需要更多的配合的交流,没有标准可不行。终于有人按捺不住了,出个标准开放出来,大家都用起来吧。自己的算法也就成标准的了,最先推出的是twitter
,他们还给起了个名字:

分布式自增ID算法——雪花算法 (SnowFlake)

软件生成唯一ID号(流水号)那些事_第1张图片
image.png

好象真的没必要多说了,一看就明白了。这已经成为事实上的一个简易标准了。
需要注意的是:
时间是以10ms为单位的,所以更加精确,够用64年的。在座的程序员不用担心退休前软件有bug的,哈哈哈哈。

参考资料:
https://www.sohu.com/a/232008315_453160

你可能感兴趣的:(软件生成唯一ID号(流水号)那些事)