package main
import (
"fmt"
"time"
)
func main() {
var epoch int64 = 1577836800000 // 2020-01-01 00:00:00
var machineID uint8 = 1
for i := 0; i < 10; i++ {
now := time.Now().UnixNano() / 1000000
id := (now-epoch)<<22 | int64(machineID)<<16 | int64(i)
fmt.Printf("%d\n", id%(int64(10)^5))
}
}
// 输出结果: // 43926 // 43927 // 43928 // 43929 // 43930 // 43931 // 43932 // 43933 // 43934 // 43935
// 说明: // epoch:起始时间,这里设为 2020-01-01 00:00:00 的毫秒时间戳 // machineID:机器编号,这里设为固定值 1 // i:循环计数器,用来区分同一毫秒内生成的不同 ID // now:当前时间的毫秒时间戳 // id:雪花算法生成的 ID,其中 timestamp 占 42 位(从 epoch 开始计算),machineID 占 4 位,i 占 18 位 // id%(int64(10)^5):将 id 取模后,返回一个 5 位数的 ID,即固定位数