ID Generator算法

算法:7位集群+40位时间戳+7位每秒最大生产个数数

适用于集群下唯一id生成:



public class TimeStampIDGenerator{

/**
* workerID must be unique for each node in cluster.
*/
private long workerID;

private long sequence = 0;
private long mark = 0;

private static final int MAXSEQUENCE = 128;
private static final int MAXWORKERID = 128;

private long lastTimeGen;

private final int workerIDBitWidth = 7;
private final int timeStampBitWidth = 40;
private final int sequenceBitWidth = 7;

private long sequenceLeftShift = 0;
private long timeStampLeftShift = sequenceBitWidth;
private long workerIDLeftShift = sequenceBitWidth + timeStampBitWidth;

/**
* MillSeconds from January 1, 1970 to November 3rd 2010
*/
private final long TIMEBASELINE = 1288834974657L;

public long nextId() {
synchronized (this) {
long timeGen = timeGen();
mark++;
sequence = (++sequence) % MAXSEQUENCE;
if (timeGen == lastTimeGen) {
if (mark >= MAXSEQUENCE) {
timeGen = tillNextMill();
mark = 0;
}
} else {
mark = 0;
}
lastTimeGen = timeGen;

return sequence << sequenceLeftShift | (timeGen - TIMEBASELINE) << timeStampLeftShift
| workerID << workerIDLeftShift;
}

}

public void setWorkerID(long id) {
if (validateWorkerID(id)) {
workerID = id;
} else {
throw new IllegalStateException("invalid id:" + id);
}
}

private boolean validateWorkerID(long id) {
if (id > MAXWORKERID || id < 0) {
return false;
} else {
return true;
}
}

private long tillNextMill() {
long timeGen = timeGen();
while (timeGen <= lastTimeGen) {
timeGen = timeGen();
}
// System.out.println("i'm in tillNextMill");
return timeGen;
}

private long timeGen() {
return System.currentTimeMillis();
}

@Override
public long generateId() {
return this.nextId();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值