雪花算法逆推创建时间
雪花算法由 时间戳 + 机器码+ 序列化组成
以 github.com/sony/sonyflake中的雪花算法举例
源码如下
时间戳是从一个指定的startTime过去的时间。(从toSonyflakeTime可知时间进去到毫秒级的前1位)
得到id的位移方法
逆推方法
生成时间 = id >> (机器码位数 + 序列号位数) + 起始时间
package main
import (
"fmt"
"github.com/sony/sonyflake"
"time"
)
func main() {
var st sonyflake.Settings
sf := 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直接计算出所在的表的分表名。能排除大量的查找。