当前位置: 首页 > news >正文

雪花算法-uuid

雪花算法,分布式系统全局唯一ID生成算法

整个id使用了一个64bit的long数字

  • 第一部分:占用1个bit,最高符号位,0表示正数 1表示负数
  • 第二部分:占用41个bit,毫秒时间戳,41位可以表示2^40个值,也就是69年
  • 第三部分:占用10个bit,机房和机器ID,自己可以定义前5位为机房ID,后5位为机器ID,也就是可以有32个机房,每个机房有32个机器 合计1024台机器 当然你把这10位全部作为机器ID也可以
  • 第四部分:占用12个bit,同一毫秒内产生的不同ID,12位,也就意味着同一毫秒内一台机器可以产生2^12=4096个随机数

代码实现

自己实现+第三方包,两种方式

internal/app/lib/randx/snowflake/face.go

packagesnowflake/** * 雪花算法 * 分布式唯一ID生成算法 * 生成的ID是一个64位的整数,分位4部分 * ******************************************************************************* * 0 00000000000000000000000000000000000000000 0000000000 000000000000 * [0+41+10+12] * 第1位是符号位,始终为0 * 41位是时间戳 * 10位是工作机器ID * 最后的12位是序列号,即同一毫秒内生成的不同ID的序 0-4095 * ******************************************************************************* * 1. 将毫秒时间戳,二进制左移22位 * 2. 将机器ID,二进制左移12位 * 3. 将序列号,二进制即可,无需位移 * 4. 进行位或运算,转化10进制 */typeSnowFlakeFaceinterface{GetId()uint64// 自定义实现GetSonyId()uint64// 第三方包实现}

internal/app/lib/randx/snowflake/work/snowflake.go

packageworkimport("peak/internal/app/global""peak/internal/app/lib/randx/snowflake""sync""time""github.com/sony/sonyflake")/** * 雪花算法自定义实现 * 我们认为,以同一毫秒内可生成固定的随机ID来作为准则,那么我们传入的时间timestamp可作为雪花算法变量 */typeSnowflakestruct{sync.Mutex timestampint64// 时间戳,如需自定义也可自己传入machineIdint64// 当前代码部署的机器idsequenceint64// 序列号sony*sonyflake.Sonyflake}funcCreateSnowflakeFactory()snowflake.SnowFlakeFace{SnowFlakeMachineId:=global.ConfigYml.GetInt64("SnowFlake.SnowFlakeMachineId")settings:=sonyflake.Settings{MachineID:func()(uint16,error){returnuint16(SnowFlakeMachineId),nil},}return&Snowflake{timestamp:0,machineId:SnowFlakeMachineId,sequence:0,sony:sonyflake.NewSonyflake(settings),}}/** * e为科学技术法,1e6=1*10^6 * now 当前毫秒时间戳 */func(s*Snowflake)GetId()uint64{s.Lock()deferfunc(){s.Unlock()}()now:=time.Now().UnixNano()/1e6ifs.timestamp==now{s.sequence=(s.sequence+1)&global.SequenceMaskifs.sequence==0{fornow<=s.timestamp{now=time.Now().UnixNano()/1e6}}}else{s.sequence=0}s.timestamp=now r:=(now-global.StartTimeStamp)<<global.TimestampShift|(s.machineId<<global.MachineIdShift)|(s.sequence)returnuint64(r)}func(s*Snowflake)GetSonyId()uint64{r,_:=s.sony.NextID()returnr}// 解析idfuncParseID(iduint64)map[string]uint64{//TODO 暂时只支持snoy生成的idreturnsonyflake.Decompose(id)}
http://www.jsqmd.com/news/529037/

相关文章:

  • CentOS7断电后卡在登录界面?三步搞定XFS文件系统修复(附SELinux避坑指南)
  • 动态调整模糊分割系数
  • XBee 1.0 API模式C语言嵌入式通信库详解
  • 依然似故人_孙珍妮文生图教程:Z-Image-Turbo镜像在树莓派5+GPU扩展板上的轻量部署
  • Apache Storm并行度优化终极指南:如何最大化利用集群计算能力
  • 最近在折腾海康威视工业相机的二次开发,发现网上针对多相机管理的C#案例确实不多。直接上干货,分享几个关键点和踩过的坑
  • 如何快速掌握fastMRI:医学影像重建的终极入门指南
  • WuliArt Qwen-Image Turbo全流程解析:从输入Prompt到保存图片,一步步带你操作
  • 嵌入式OLED驱动库:SSD1306/SH1106轻量级显示解决方案
  • 终极指南:如何用XLNet在GLUE基准测试中实现多任务语言理解新高度
  • RN41/RN42蓝牙模块嵌入式控制库详解
  • Win10系统下ANSYS 18.2与Visual Studio 2012及Intel Fortran的协同配置指南
  • TeXMe:让Markdown与LaTeX无缝融合的自渲染解决方案
  • 5步焕新你的旧设备:OpenCore Legacy Patcher全攻略
  • Qwen2-VL-2B-Instruct数据库课程设计:构建多模态内容管理平台
  • 乐山美食推荐:五代传承的非遗老汤,藏在苏稽老宅里的跷脚牛肉 - 新闻快传
  • 如何用Path of Building轻松构建你的流放之路角色:从零到精通的完整指南
  • 3步搞定网页视频:猫抓工具的媒体资源高效获取方案
  • TensorFlow多类支持向量机终极指南:一对多策略实现详解
  • 明晚开播|PostgreSQL 18.3 x IvorySQL 5.3:开启 AI 数据库新纪元
  • Symfony Translation缓存性能终极比较:Redis vs Memcached vs APCu
  • 如何用Python实现多平台媒体内容自动化采集:从技术原理到实战应用
  • PDF补丁丁完整指南:掌握全能PDF编辑工具的终极教程
  • WhateverGreen性能优化终极指南:让你的显卡在macOS上发挥最大潜力
  • Neorg 完整指南:如何在 Neovim 中实现高效笔记管理和任务组织
  • 如何高效配置OCR引擎:解决Umi-OCR HTTP服务响应问题的完整指南
  • Symfony Translation终极性能优化指南:从数据到实践
  • 终极指南:7款Unity建模工具深度评测,从SabreCSG到专业插件
  • VLC播放器美化终极指南:5分钟打造专属影院级播放体验!
  • 2026年白炭黑生产厂家推荐:潍坊三佳化工有限公司,超细/工业级/食品级白炭黑全系供应 - 品牌推荐官