java如何收成流水号

java如何收成流水号

public class SnowflakeIdGenerator {

private final long epoch = 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 SnowflakeIdGenerator(long workerId, long datacenterId) {

if (workerId > maxWorkerId || workerId < 0) {

throw new IllegalArgumentException("worker Id can't be greater than " + maxWorkerId + " or less than 0");

}

if (datacenterId > maxDatacenterId || datacenterId < 0) {

throw new IllegalArgumentException("datacenter Id can't be greater than " + maxDatacenterId + " or less than 0");

}

this.workerId = workerId;

this.datacenterId = datacenterId;

}

public synchronized long nextId() {

long timestamp = timeGen();

if (timestamp < lastTimestamp) {

throw new RuntimeException("Clock moved backwards. Refusing to generate id for " + (lastTimestamp - timestamp) + " milliseconds");

}

if (lastTimestamp == timestamp) {

sequence = (sequence + 1) & sequenceMask;

if (sequence == 0) {

timestamp = tilNextMillis(lastTimestamp);

}

} else {

sequence = 0L;

}

lastTimestamp = timestamp;

return ((timestamp - epoch) << 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) {

SnowflakeIdGenerator generator = new SnowflakeIdGenerator(1, 1);

System.out.println(generator.nextId());

System.out.println(generator.nextId());

}

}

相关推荐

外贸人必备邮箱怎么选?实用指南看这里!
365有没有反水的

外贸人必备邮箱怎么选?实用指南看这里!

⌛ 10-13 👁️ 5082
人体直接暴露在太空会发生什么?
365有没有反水的

人体直接暴露在太空会发生什么?

⌛ 09-12 👁️ 9345
Windows 翻墙教程:从零开始科学上网(最稳定的科学上网方案)