推特(Twitter)的Snowflake算法——用于生成唯一ID
1.前言 关于如何在系统中生成唯一性ID的问题(如订单号、批次号等),一直困扰了许久。因为还要考虑并发的问题,所以时间戳+随机数的组合并不可取,Java中的UUID是一种可取的方法,但它的缺点是序列号太长了,而且没有可读性,对用户来说这么一堆乱码是极不友好的。 推特的工程师snowflake也提出了一个在分布式系统中生成唯一序列的方法。SnowFlake的优点是,效率高,整体上按照时间自增排序,提高了序列号的可读性,对用户来说也比较友好,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分)。 2.SnowFlake算法的Java实现 1 /** 2 * @author Jakeylove3 3 * 2017/12/31 4 */ 5 6 /** 7 * Twitter_Snowflake 8 * SnowFlake的结构如下(每部分用-分开): 9 * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 10 * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0 11 * 41位时间戳(毫秒级),注意,41位时间戳不是存储当前时间的时间戳,而是存储时间戳的差值(当前时间戳 -