雪花算法由 时间戳 + 机器码+ 序列化组成
时间戳是从一个指定的startTime过去的时间。(从toSonyflakeTime可知时间进去到毫秒级的前1位)
得到id的位移方法
生成时间 = id >> (机器码位数 + 序列号位数) + 起始时间
package mainimport ("fmt""github/sony/sonyflake""time"
)func main() {var st sonyflake.Settingssf := sonyflake.NewSonyflake(st)if sf == nil {panic("sonyflake not created")}id, err := sf.NextID()if err != nil {panic(err)}startTime := toSonyflakeTime(st.StartTime)fmt.Println("gen id :", id)fmt.Println("start_time:", startTime)fmt.Println("spend:", time.Now().UnixMilli()-startTime.UnixMilli())t := id >> (sonyflake.BitLenMachineID + sonyflake.BitLenSequence)fmt.Println("need :", t)res := startTime.UnixNano()/1e7 + int64(t)fmt.Println(time.UnixMilli(res * 10))//279004813828
}
func toSonyflakeTime(t time.Time) time.Time {if t.IsZero() {return time.Date(2014, 9, 1, 0, 0, 0, 0, time.UTC)}return t.UTC()}
数据库进行分片如果是根据时间规则切分的,可以利用id直接计算出所在的表的分表名。能排除大量的查找。
本文发布于:2024-01-30 04:36:16,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170656058019264.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |