具体详解请看:http://www.lanindex.com/twitter-snowflake%EF%BC%8C64%E4%BD%8D%E8%87%AA%E5%A2%9Eid%E7%AE%97%E6%B3%95%E8%AF%A6%E8%A7%A3/
代码来源于网络:
public class IdWorker { //http://www.lanindex.com/twitter-snowflake%EF%BC%8C64%E4%BD%8D%E8%87%AA%E5%A2%9Eid%E7%AE%97%E6%B3%95%E8%AF%A6%E8%A7%A3/ /*snowflake的结构如下(每部分用-分开): 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 第一位为未使用,接下来的41位为毫秒级时间(41位的长度可以使用69年),然后是5位datacenterId和5位workerId(10位的长度最多支持部署1024个节点) ,最后12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号) 一共加起来刚好64位,为一个Long型。(转换成字符串长度为18) snowflake生成的ID整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和workerId作区分),并且效率较高。据说:snowflake每秒能够产生26万个ID。*/ private final long twepoch = 1288834974657L; private final long workerIdBits = 5L; private final long datacenterIdBits = 5L; private final long maxWorkerId = -1L ^ (-1L << workerIdBits); private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); private final long sequenceBits = 12L; private final long workerIdShift = sequenceBits; private final long datacenterIdShift = sequenceBits + workerIdBits; private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; private final long sequenceMask = -1L ^ (-1L << sequenceBits); private long workerId; private long datacenterId; private long sequence = 0L; private long lastTimestamp = -1L; public IdWorker(long workerId, long datacenterId) { if (workerId > maxWorkerId || workerId < 0) { throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); } if (datacenterId > maxDatacenterId || datacenterId < 0) { throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); } this.workerId = workerId; this.datacenterId = datacenterId; } public synchronized long nextId() { long timestamp = timeGen(); if (timestamp < lastTimestamp) { throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); } if (lastTimestamp == timestamp) { sequence = (sequence + 1) & sequenceMask; if (sequence == 0) { timestamp = tilNextMillis(lastTimestamp); } } else { sequence = 0L; } lastTimestamp = timestamp; return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence; } protected long tilNextMillis(long lastTimestamp) { long timestamp = timeGen(); while (timestamp <= lastTimestamp) { timestamp = timeGen(); } return timestamp; } protected long timeGen() { return System.currentTimeMillis(); } public static void main(String[] args) { IdWorker idWorker = new IdWorker(0, 0); for (int i = 0; i < 1000; i++) { long id = idWorker.nextId(); System.out.println(id); } } }
相关推荐
A library which uses to generate Global Unique Ids based on snowflake,An alternative of UUID. Usage allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { compile ...
Twitter-Snowflake算法,java代码实现,采用默认配置,单例单机模式
动态生产有规律的ID Snowflake算法是Twitter的工程师为实现递增而不重复的ID实现的 C# 实现 Snowflake算法
分布式ID生成,主键生成,Java实现的snowflake算法
最近项目需要解决高并发分布式生成唯一ID值的问题,经过考虑,采用Snowflake算法,该算法是一个很有效的办法,具体的可以自己百度,这里是基于thinkPHP5 开发的通用的生成器,其实也是参考了网上的方法,只是增加了...
分布式ID生成,主键生成策略,snowflake算法,采用java实现。
Delphi Snowflake 算法
雪花算法,分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种。
Twitter Snowflake算法,php版代码; 请见博客: http://blog.csdn.net/envon123/article/details/52953872
idworker是一个基于zookeeper和snowflake算法的分布式统一ID生成工具,通过zookeeper自动注册机器(最多1024台),无需手动指定workerId和dataCenterId 怎么用 Maven < groupId>com.imadcn.framework</ groupId> ...
前言:最近需要做一套CMS系统,由于功能比较单一,而且要求灵活,所以放弃了WP这样的成熟系统,自己做一套相对简单一点的。...最终选择了Twitter的SnowFlake算法 这个算法的好处很简单可以在每秒产生约400W个不同的16位
一个基于Snowflake算法PHP ID生成器(Twitter已宣布)。描述雪花算法PHP实现。 Snowflake是一项网络服务,可通过一些简单的保证大规模生成唯一的ID号。 第一位是未使用的符号位。 第二部分包括一个41位的时间戳...
We have retired the initial release of Snowflake and working on open sourcing the next version based on Twitter-server, in a form that can run anywhere without requiring Twitter's own infrastructure ...
SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下: * 1位,不用 * 41位,用来记录时间戳(毫秒) * 10位,用来记录工作机器id * 12位,序列号,用来记录同毫秒内产生的不同id SnowFlake算法可以...
多语言版、包含生成16位、18位、19位3种长度的雪花ID算法汇总。 idgenerator 16位雪花ID(多语言版,包括java、C#、Go、Python、NodeJs、PHP、Rust、SQL); itsm-learning 18位雪花ID(C#版); snowflake-net 19...
twitter的snowflake算法 用java实现
* Twitter_Snowflake * SnowFlake的结构如下(每部分用-分开): * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 * 1位标识,由于long基本类型在Java中是带...
全球唯一的订单标识snowflake 算法,通过java 版本改写,已测试1亿个字串没重复,根据时间戳来,不会出现重复
提到id生成器,twitter的snowflake算法 不得不被提起,但是snowflake的算法因为使用了二进制的移位做法,导致其生成的算法过 度的对于机器友好,对于人类并不是那么的友好,也就是说snowflake生成的id对于人类来 说...