1
0
mirror of synced 2025-12-14 00:58:09 +08:00
Files
SnowFlake-IdGenerator/D/source/yitter/idgen/DefaultIdGenerator.d
BitWorld 7673c9f441 !7 D语言版本性能提升
* Better performace for D.
2021-04-09 16:13:19 +08:00

100 lines
3.1 KiB
D
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 版权属于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("errorWorkerIdBitLength + 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();
}
}