
雪花算法分布式系统全局唯一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同一毫秒内产生的不同ID12位也就意味着同一毫秒内一台机器可以产生2^124096个随机数代码实现自己实现第三方包两种方式internal/app/lib/randx/snowflake/face.gopackagesnowflake/** * 雪花算法 * 分布式唯一ID生成算法 * 生成的ID是一个64位的整数分位4部分 * ******************************************************************************* * 0 00000000000000000000000000000000000000000 0000000000 000000000000 * [0411012] * 第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.gopackageworkimport(peak/internal/app/globalpeak/internal/app/lib/randx/snowflakesynctimegithub.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},}returnSnowflake{timestamp:0,machineId:SnowFlakeMachineId,sequence:0,sony:sonyflake.NewSonyflake(settings),}}/** * e为科学技术法1e61*10^6 * now 当前毫秒时间戳 */func(s*Snowflake)GetId()uint64{s.Lock()deferfunc(){s.Unlock()}()now:time.Now().UnixNano()/1e6ifs.timestampnow{s.sequence(s.sequence1)global.SequenceMaskifs.sequence0{fornows.timestamp{nowtime.Now().UnixNano()/1e6}}}else{s.sequence0}s.timestampnow r:(now-global.StartTimeStamp)global.TimestampShift|(s.machineIdglobal.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)}