auto commit
This commit is contained in:
@@ -11,7 +11,7 @@ namespace Yitter.OrgSystem.TestA
|
||||
class Program
|
||||
{
|
||||
// 测试参数(默认配置下,最佳性能是10W/s)
|
||||
static int genIdCount = 50000; // 计算ID数量(如果要验证50W效率,请将TopOverCostCount设置为20000或适当增加SeqBitLength)
|
||||
static int genIdCount = 2;//50000; // 计算ID数量(如果要验证50W效率,请将TopOverCostCount设置为20000或适当增加SeqBitLength)
|
||||
static short method = 1; // 1-漂移算法,2-传统算法
|
||||
|
||||
|
||||
@@ -35,9 +35,12 @@ namespace Yitter.OrgSystem.TestA
|
||||
|
||||
WorkerIdBitLength = 6,
|
||||
SeqBitLength = 6,
|
||||
DataCenterIdBitLength = 10,
|
||||
TopOverCostCount = 2000,
|
||||
|
||||
//MinSeqNumber = 1,
|
||||
//TimestampType = 1,
|
||||
|
||||
// MinSeqNumber = 1,
|
||||
// MaxSeqNumber = 200,
|
||||
|
||||
// BaseTime = DateTime.Now.AddYears(-10),
|
||||
@@ -128,6 +131,7 @@ namespace Yitter.OrgSystem.TestA
|
||||
MinSeqNumber = options.MinSeqNumber,
|
||||
MaxSeqNumber = options.MaxSeqNumber,
|
||||
Method = options.Method,
|
||||
//TimestampType = 1,
|
||||
};
|
||||
|
||||
Console.WriteLine("Gen:" + i);
|
||||
|
||||
@@ -64,6 +64,22 @@ namespace Yitter.IdGenerator
|
||||
public virtual int TopOverCostCount { get; set; } = 2000;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 数据中心ID(默认0)
|
||||
/// </summary>
|
||||
public virtual uint DataCenterId { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 数据中心ID长度(默认0)
|
||||
/// </summary>
|
||||
public virtual byte DataCenterIdBitLength { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 时间戳类型(0-毫秒,1-秒),默认0
|
||||
/// </summary>
|
||||
public virtual byte TimestampType { get; set; } = 0;
|
||||
|
||||
|
||||
public IdGeneratorOptions()
|
||||
{
|
||||
|
||||
|
||||
@@ -51,9 +51,9 @@ namespace Yitter.IdGenerator
|
||||
/// <summary>
|
||||
/// 最大漂移次数(含)
|
||||
/// </summary>
|
||||
protected readonly int TopOverCostCount = 0;
|
||||
protected int TopOverCostCount = 0;
|
||||
|
||||
protected readonly byte _TimestampShift = 0;
|
||||
protected byte _TimestampShift = 0;
|
||||
protected static object _SyncLock = new object();
|
||||
|
||||
protected ushort _CurrentSeqNumber;
|
||||
@@ -215,7 +215,7 @@ namespace Yitter.IdGenerator
|
||||
_TurnBackIndex));
|
||||
}
|
||||
|
||||
private long NextOverCostId()
|
||||
protected virtual long NextOverCostId()
|
||||
{
|
||||
long currentTimeTick = GetCurrentTimeTick();
|
||||
|
||||
@@ -262,7 +262,7 @@ namespace Yitter.IdGenerator
|
||||
return CalcId(_LastTimeTick);
|
||||
}
|
||||
|
||||
private long NextNormalId()
|
||||
protected virtual long NextNormalId()
|
||||
{
|
||||
long currentTimeTick = GetCurrentTimeTick();
|
||||
|
||||
@@ -319,7 +319,7 @@ namespace Yitter.IdGenerator
|
||||
return CalcId(_LastTimeTick);
|
||||
}
|
||||
|
||||
private long CalcId(in long useTimeTick)
|
||||
protected virtual long CalcId(in long useTimeTick)
|
||||
{
|
||||
var result = ((useTimeTick << _TimestampShift) +
|
||||
((long)WorkerId << SeqBitLength) +
|
||||
@@ -329,7 +329,7 @@ namespace Yitter.IdGenerator
|
||||
return result;
|
||||
}
|
||||
|
||||
private long CalcTurnBackId(in long useTimeTick)
|
||||
protected virtual long CalcTurnBackId(in long useTimeTick)
|
||||
{
|
||||
var result = ((useTimeTick << _TimestampShift) +
|
||||
((long)WorkerId << SeqBitLength) + _TurnBackIndex);
|
||||
|
||||
83
C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM3.cs
Normal file
83
C#.NET/source/Yitter.IdGenerator/Core/SnowWorkerM3.cs
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* 版权属于:yitter(yitter@126.com)
|
||||
* 开源地址:https://github.com/yitter/idgenerator
|
||||
* 版权协议:MIT
|
||||
* 版权说明:只要保留本版权,你可以免费使用、修改、分发本代码。
|
||||
* 免责条款:任何因为本代码产生的系统、法律、政治、宗教问题,均与版权所有者无关。
|
||||
*
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Yitter.IdGenerator
|
||||
{
|
||||
/// <summary>
|
||||
/// 雪花漂移算法(支持数据中心ID和秒级时间戳)
|
||||
/// </summary>
|
||||
internal class SnowWorkerM3 : SnowWorkerM1
|
||||
{
|
||||
/// <summary>
|
||||
/// 数据中心ID(默认0)
|
||||
/// </summary>
|
||||
protected readonly uint DataCenterId = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 数据中心ID长度(默认0)
|
||||
/// </summary>
|
||||
protected readonly byte DataCenterIdBitLength = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 时间戳类型(0-毫秒,1-秒),默认0
|
||||
/// </summary>
|
||||
protected readonly byte TimestampType = 0;
|
||||
|
||||
|
||||
public SnowWorkerM3(IdGeneratorOptions options) : base(options)
|
||||
{
|
||||
// 秒级时间戳类型
|
||||
TimestampType = options.TimestampType;
|
||||
|
||||
// DataCenter相关
|
||||
DataCenterId = options.DataCenterId;
|
||||
DataCenterIdBitLength = options.DataCenterIdBitLength;
|
||||
|
||||
if (TimestampType == 1)
|
||||
{
|
||||
TopOverCostCount = 0;
|
||||
}
|
||||
_TimestampShift = (byte)(DataCenterIdBitLength + WorkerIdBitLength + SeqBitLength);
|
||||
}
|
||||
|
||||
protected override long CalcId(in long useTimeTick)
|
||||
{
|
||||
var result = ((useTimeTick << _TimestampShift) +
|
||||
((long)DataCenterId << DataCenterIdBitLength) +
|
||||
((long)WorkerId << SeqBitLength) +
|
||||
(long)_CurrentSeqNumber);
|
||||
|
||||
_CurrentSeqNumber++;
|
||||
return result;
|
||||
}
|
||||
|
||||
protected override long CalcTurnBackId(in long useTimeTick)
|
||||
{
|
||||
var result = ((useTimeTick << _TimestampShift) +
|
||||
((long)DataCenterId << DataCenterIdBitLength) +
|
||||
((long)WorkerId << SeqBitLength) +
|
||||
_TurnBackIndex);
|
||||
|
||||
_TurnBackTimeTick--;
|
||||
return result;
|
||||
}
|
||||
|
||||
protected override long GetCurrentTimeTick()
|
||||
{
|
||||
return TimestampType == 0 ?
|
||||
(long)(DateTime.UtcNow - BaseTime).TotalMilliseconds :
|
||||
(long)(DateTime.UtcNow - BaseTime).TotalSeconds;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -46,12 +46,12 @@ namespace Yitter.IdGenerator
|
||||
{
|
||||
throw new ApplicationException("WorkerIdBitLength error.(range:[1, 21])");
|
||||
}
|
||||
if (options.SeqBitLength + options.WorkerIdBitLength > 22)
|
||||
if (options.DataCenterIdBitLength + options.WorkerIdBitLength + options.SeqBitLength > 22)
|
||||
{
|
||||
throw new ApplicationException("error:WorkerIdBitLength + SeqBitLength <= 22");
|
||||
throw new ApplicationException("error:DataCenterIdBitLength + WorkerIdBitLength + SeqBitLength <= 22");
|
||||
}
|
||||
|
||||
// 3.WorkerId
|
||||
// 3.WorkerId & DataCenterId
|
||||
var maxWorkerIdNumber = (1 << options.WorkerIdBitLength) - 1;
|
||||
if (maxWorkerIdNumber == 0)
|
||||
{
|
||||
@@ -62,6 +62,12 @@ namespace Yitter.IdGenerator
|
||||
throw new ApplicationException("WorkerId error. (range:[0, " + maxWorkerIdNumber + "]");
|
||||
}
|
||||
|
||||
var maxDataCenterIdNumber = (1 << options.DataCenterIdBitLength) - 1;
|
||||
if (options.DataCenterId < 0 || options.DataCenterId > maxDataCenterIdNumber)
|
||||
{
|
||||
throw new ApplicationException("DataCenterId error. (range:[0, " + maxDataCenterIdNumber + "]");
|
||||
}
|
||||
|
||||
// 4.SeqBitLength
|
||||
if (options.SeqBitLength < 2 || options.SeqBitLength > 21)
|
||||
{
|
||||
@@ -87,18 +93,22 @@ namespace Yitter.IdGenerator
|
||||
|
||||
switch (options.Method)
|
||||
{
|
||||
case 1:
|
||||
_SnowWorker = new SnowWorkerM1(options);
|
||||
break;
|
||||
case 2:
|
||||
_SnowWorker = new SnowWorkerM2(options);
|
||||
break;
|
||||
default:
|
||||
_SnowWorker = new SnowWorkerM1(options);
|
||||
if (options.DataCenterIdBitLength == 0 && options.TimestampType == 0)
|
||||
{
|
||||
_SnowWorker = new SnowWorkerM1(options);
|
||||
}
|
||||
else
|
||||
{
|
||||
_SnowWorker = new SnowWorkerM3(options);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (options.Method == 1)
|
||||
if (options.Method != 2)
|
||||
{
|
||||
Thread.Sleep(500);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user