雪花算法(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.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现