unit uSnowWorkerM3; interface uses System.SysUtils, System.DateUtils, uSnowWorkerM1, uIdGeneratorOptions, System.SyncObjs; /// /// 雪花漂移算法(支持数据中心ID和秒级时间戳) /// type TSnowWorkerM3 = class(TSnowWorkerM1) protected FDataCenterId: Cardinal; FDataCenterIdBitLength: Byte; FTimestampType: Byte; protected /// /// 数据中心ID(默认0) /// property DataCenterId: Cardinal read FDataCenterId default 0; /// /// 数据中心ID长度(默认0) /// property DataCenterIdBitLength: Byte read FDataCenterIdBitLength default 0; /// /// 时间戳类型(0-毫秒,1-秒),默认0 /// property TimestampType: Byte read FTimestampType default 0; protected function CalcId(UseTimeTick: Int64): Int64; override; function CalcTurnBackId(UseTimeTick: Int64): Int64; override; function GetCurrentTimeTick(): Int64; override; public constructor Create(options: TIdGeneratorOptions); overload; end; implementation { TSnowWorkerM3 } constructor TSnowWorkerM3.Create(options: TIdGeneratorOptions); begin // 秒级时间戳类型 FTimestampType := options.TimestampType; // DataCenter相关 FDataCenterId := options.DataCenterId; FDataCenterIdBitLength := options.DataCenterIdBitLength; if (FTimestampType = 1) then begin FTopOverCostCount := 0; end; FTimestampShift := Byte(DataCenterIdBitLength + WorkerIdBitLength + SeqBitLength); inherited Create(options); end; function TSnowWorkerM3.CalcId(UseTimeTick: Int64): Int64; begin Result := ((UseTimeTick shl FTimestampShift) + (Int64(DataCenterId) shl DataCenterIdBitLength) + (Int64(WorkerId) shl SeqBitLength) + Int64(FCurrentSeqNumber)); Inc(FCurrentSeqNumber); end; function TSnowWorkerM3.CalcTurnBackId(UseTimeTick: Int64): Int64; begin Result := ((UseTimeTick shl FTimestampShift) + (Int64(DataCenterId) shl DataCenterIdBitLength) + (Int64(WorkerId) shl SeqBitLength) + FTurnBackIndex); Dec(FTurnBackTimeTick); end; function TSnowWorkerM3.GetCurrentTimeTick: Int64; var Millis: Int64; begin if (TimestampType = 0) then begin Millis := GetMillisecondTimeStamp(); Result := Millis - FBaseTime; end else begin Millis := GetSecondTimeStamp(); Result := Millis - FBaseTime; end; end; end.