简单实用算法—分布式自增ID算法snowflake(雪花算法)
算法概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序ID生成机制,所以开发了这样一套全局唯一ID生成服务。 该项目地址(Scala实现): https://github.com/twitter/snowflake python版项目地址: https://github.com/erans/pysnowflake ID结构 Snowflake生成的是Long类型的ID,一个Long类型占8个字节,每个字节占8比特,也就是说一个Long类型占64个比特。 snowflake的结构如下(每部分用-分开): 注:上图的 工作机器id(10比特)=数据中心(占左5比特)+ 机器ID(占右5比特) Snowflake ID组成结构:正数位(占1比特)+ 时间戳(占41比特)+ 数据中心(占5比特)+ 机器ID(占5比特)+ 自增值(占12比特) 第一位为未使用,接下来的41位为毫秒级时间(41位的长度可以使用69年)