1. 程式人生 > >雪花演算法(snowflake)delphi版

雪花演算法(snowflake)delphi版

雪花演算法簡單描述: + 最高位是符號位,始終為0,不可用。 + 41位的時間序列,精確到毫秒級,41位的長度可以使用69年。時間位還有一個很重要的作用是可以根據時間進行排序。 + 10位的機器標識,10位的長度最多支援部署1024個節點。 + 12位的計數序列號,序列號即一系列的自增id,可以支援同一節點同一毫秒生成多個ID序號,12位的計數序列號支援每個節點每毫秒產生4096個ID序號。 看的出來,這個演算法很簡潔也很簡單,但依舊是一個很好的ID生成策略。其中,10位器識別符號一般是5位IDC+5位machine編號,唯一確定一臺機器。 delphi版本是不得閒折騰的,QQ75492895,我這算是轉載,原始碼如下:
(*
 Delphi版雪花演算法
 作者:不得閒 QQ:75492895
 用於生成Int64位的唯一值ID,WorkerID用於區分工作站,
 ID會隨著時間增加位數,每毫秒可生成4096個ID
 
 用法:
 建立全域性變數:snow: TDxSnowflake;
 建立物件:snow := TDxSnowflake.Create; // 不要忘了在退出時釋放snow.Free;
 呼叫:
 snow.WorkerID:=100;
 mmo1.Lines.Add( FormatFloat('#0',snow.Generate));
*) unit DxSnowflake; interface uses System.SysUtils, System.SyncObjs, System.Generics.Collections, System.DateUtils; type TWorkerID = 0 .. 1023; TDxSnowflake = class private FWorkerID: TWorkerID; FLocker: TCriticalSection; fTime: Int64; fstep: Int64; public constructor
Create; destructor Destroy; override; property WorkerID: TWorkerID read FWorkerID write FWorkerID; function Generate: Int64; end; implementation const Epoch: Int64 = 1539615188000; // 北京時間2018-10-15號 // 工作站的節點位數 WorkerNodeBits: Byte = 10; // 序列號的節點數 StepBits: Byte = 12; timeShift: Byte
= 22; nodeShift: Byte = 12; var WorkerNodeMax: Int64; nodeMask: Int64; stepMask: Int64; procedure InitNodeInfo; begin WorkerNodeMax := -1 xor (-1 shl WorkerNodeBits); nodeMask := WorkerNodeMax shl StepBits; stepMask := -1 xor (-1 shl StepBits); end; { TDxSnowflake } constructor TDxSnowflake.Create; begin FLocker := TCriticalSection.Create; end; destructor TDxSnowflake.Destroy; begin FLocker.Free; inherited; end; function TDxSnowflake.Generate: Int64; var curtime: Int64; begin FLocker.Acquire; try curtime := DateTimeToUnix(Now) * 1000; if curtime = fTime then begin fstep := (fstep + 1) and stepMask; if fstep = 0 then begin while curtime <= fTime do curtime := DateTimeToUnix(Now) * 1000; end; end else fstep := 0; fTime := curtime; Result := (curtime - Epoch) shl timeShift or FWorkerID shl nodeShift or fstep; finally FLocker.Release; end; end; initialization InitNodeInfo; end.

說明和註釋,我寫在最上面的註釋裡了,這個拿來生成業務流水號真的很方便。

WebPascal指令碼模型教程 - 網頁...