package com.idworker;

public class IdWorker {
	private final long workerId;
	private final static long twepoch = 1288834974657L;
	private long sequence = 0L;
	private final static long workerIdBits = 4L;
	public final static long maxWorkerId = -1L ^ -1L << workerIdBits;
	private final static long sequenceBits = 10L;

	private final static long workerIdShift = sequenceBits;
	private final static long timestampLeftShift = sequenceBits + workerIdBits;
	public final static long sequenceMask = -1L ^ -1L << sequenceBits;

	private long lastTimestamp = -1L;

	public IdWorker(final long workerId) {
		super();
		if (workerId > this.maxWorkerId || workerId < 0) {
			throw new IllegalArgumentException(String.format(
					"worker Id can't be greater than %d or less than 0",
					this.maxWorkerId));
		}
		this.workerId = workerId;
	}

	public synchronized long nextId() {
		long timestamp = this.timeGen();
		if (this.lastTimestamp == timestamp) {
			this.sequence = (this.sequence + 1) & this.sequenceMask;
			if (this.sequence == 0) {
				System.out.println("###########" + sequenceMask);
				timestamp = this.tilNextMillis(this.lastTimestamp);
			}
		} else {
			this.sequence = 0;
		}
		if (timestamp < this.lastTimestamp) {
			try {
				throw new Exception(
						String.format(
								"Clock moved backwards.  Refusing to generate id for %d milliseconds",
								this.lastTimestamp - timestamp));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		this.lastTimestamp = timestamp;
		long nextId = ((timestamp - twepoch << timestampLeftShift))
				| (this.workerId << this.workerIdShift) | (this.sequence);
		System.out.println("timestamp:" + timestamp + ",timestampLeftShift:"
				+ timestampLeftShift + ",nextId:" + nextId + ",workerId:"
				+ workerId + ",sequence:" + sequence);
		return nextId;
	}

	private long tilNextMillis(final long lastTimestamp) {
		long timestamp = this.timeGen();
		while (timestamp <= lastTimestamp) {
			timestamp = this.timeGen();
		}
		return timestamp;
	}

	private long timeGen() {
		return System.currentTimeMillis();
	}
	
	
	public static void main(String[] args){
		IdWorker worker2 = new IdWorker(2);
		System.out.println(worker2.nextId());
	}

}
最近下载更多
tyoui1125  LV1 5月16日
jsonobject  LV1 2021年8月27日
zhangtiwei  LV3 2021年6月29日
qq514725355  LV1 2020年7月28日
vvsoul  LV1 2020年5月7日
zhuweidong  LV1 2020年1月9日
847417825  LV2 2019年12月19日
daliao2008  LV6 2019年12月11日
coldzera  LV4 2019年7月16日
fyqing  LV1 2018年12月11日
最近浏览更多
dapeng0011  LV15 7月17日
tyoui1125  LV1 5月16日
shinyHe  LV1 2022年4月12日
zhangtiwei  LV3 2021年6月29日
nextstep  LV11 2021年6月7日
JobsJames  LV2 2020年11月22日
terryang  LV19 2020年9月25日
qq514725355  LV1 2020年7月28日
lililiqqqq  LV1 2020年6月2日
vvsoul  LV1 2020年5月7日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友