Skip to content
程序扫地僧

生成唯一ID算法snowflake

唯一ID, Golang, snowflake1 min read

snowflake的诞生

snowflake是2010年为了在分布式环境下高效生成唯一ID(推文ID、用户消息ID等等)而设计。虽然snowflake最初版本,在2014年就已经退出历史舞台,但由于其实现简单、性能优越,已经被广泛使用多年。

snowflake的结构

snowflake生成的ID由64位组成, 下面是结构图。最高位总是保留为0,41位保存时间戳,10位保存机器ID,12位保存序列号。

snowflake结构图

  • 因为存储的是某个时间点到现在的毫秒数,需要指定一个起始时间,可以自定义,不嫌浪费也可以用epoch (1970-01-01 00:00:00 UTC), 本文使用Oct 25, 2014 05:06:02.373 UTC。按照上面的规定的初始时间,2^41毫秒可以支撑到2084-06-30 20:53:37 UTC, 到期了记得回来修bug。
  • 10位存储机器ID, 2^10 = 1024,最多可以指定1024台机器
  • 12位存储序列号。2^12 = 4096,最多可容纳4096个号, 同一时间、同一台机器下,序列号从0开始依次递增, 4096个号消耗完,则需要阻塞等待一段时间后(如阻塞100ms)重新从0开始,使用新的时间,与上次生成时间不相同时,总是从0开始。

由此可见,snowflake生成的ID是可排序的,很自然地形成了优先级为时间 > 机器 > 序列号的排序关系, 非常适合需要排序的业务场景,例如IM消息ID、推文消息ID

© 2022 by 程序扫地僧. All rights reserved.
粤ICP备2022042070号-1
使用Gatsby构建