100 lines
3.1 KiB
D
100 lines
3.1 KiB
D
/*
|
||
* 版权属于:yitter(yitter@126.com)
|
||
* 开源地址:https://gitee.com/yitter/idgenerator
|
||
*/
|
||
module yitter.idgen.DefaultIdGenerator;
|
||
|
||
import yitter.contract.IIdGenerator;
|
||
import yitter.contract.ISnowWorker;
|
||
import yitter.contract.IdGeneratorException;
|
||
import yitter.contract.IdGeneratorOptions;
|
||
|
||
import yitter.core.DateTimeHelper;
|
||
import yitter.core.SnowWorkerM1;
|
||
import yitter.core.SnowWorkerM2;
|
||
|
||
import core.thread;
|
||
import core.time;
|
||
|
||
import std.conv;
|
||
import std.datetime;
|
||
import std.stdio;
|
||
|
||
/**
|
||
*
|
||
*/
|
||
class DefaultIdGenerator : IIdGenerator {
|
||
|
||
private __gshared ISnowWorker _SnowWorker = null;
|
||
|
||
this(IdGeneratorOptions options) {
|
||
if (options is null) {
|
||
throw new IdGeneratorException("options error.");
|
||
}
|
||
|
||
// 1.BaseTime
|
||
if (options.BaseTime < 315504000000L || options.BaseTime > DateTimeHelper.currentTimeMillis) {
|
||
throw new IdGeneratorException("BaseTime error.");
|
||
}
|
||
|
||
// 2.WorkerIdBitLength
|
||
if (options.WorkerIdBitLength <= 0) {
|
||
throw new IdGeneratorException("WorkerIdBitLength error.(range:[1, 21])");
|
||
}
|
||
if (options.WorkerIdBitLength + options.SeqBitLength > 22) {
|
||
throw new IdGeneratorException("error:WorkerIdBitLength + SeqBitLength <= 22");
|
||
}
|
||
|
||
// 3.WorkerId
|
||
int maxWorkerIdNumber = (1 << options.WorkerIdBitLength) - 1;
|
||
if (maxWorkerIdNumber == 0) {
|
||
maxWorkerIdNumber = 63;
|
||
}
|
||
if (options.WorkerId < 0 || options.WorkerId > maxWorkerIdNumber) {
|
||
string msg = "WorkerId error. (range:[0, " ~ to!string((maxWorkerIdNumber > 0 ? maxWorkerIdNumber : 63)) ~ "]";
|
||
throw new IdGeneratorException(msg);
|
||
}
|
||
|
||
// 4.SeqBitLength
|
||
if (options.SeqBitLength < 2 || options.SeqBitLength > 21) {
|
||
throw new IdGeneratorException("SeqBitLength error. (range:[2, 21])");
|
||
}
|
||
|
||
// 5.MaxSeqNumber
|
||
int maxSeqNumber = (1 << options.SeqBitLength) - 1;
|
||
if (maxSeqNumber == 0) {
|
||
maxSeqNumber = 63;
|
||
}
|
||
if (options.MaxSeqNumber < 0 || options.MaxSeqNumber > maxSeqNumber) {
|
||
throw new IdGeneratorException("MaxSeqNumber error. (range:[1, " ~ maxSeqNumber.to!string() ~ "]");
|
||
}
|
||
|
||
// 6.MinSeqNumber
|
||
if (options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber) {
|
||
throw new IdGeneratorException("MinSeqNumber error. (range:[5, " ~ maxSeqNumber.to!string() ~ "]");
|
||
}
|
||
|
||
switch (options.Method) {
|
||
case 2:
|
||
_SnowWorker = new SnowWorkerM2(options);
|
||
break;
|
||
case 1:
|
||
default:
|
||
_SnowWorker = new SnowWorkerM1(options);
|
||
break;
|
||
}
|
||
|
||
if (options.Method == 1) {
|
||
try {
|
||
Thread.sleep(500.msecs);
|
||
} catch (Exception e) {
|
||
writeln(e.toString());
|
||
}
|
||
}
|
||
}
|
||
|
||
long newLong() {
|
||
return _SnowWorker.nextId();
|
||
}
|
||
}
|