Sonyflake 是一个分布式唯一 ID 生成器,灵感来自Twitter 的 Snowflake。
Sonyflake 注重多主机/核心环境下的寿命和性能。因此,它与 Snowflake 的位分配不同。Sonyflake ID 由以下部分组成:
39 bits for time in units of 10 msec8 bits for a sequence number16 bits for a machine id
对比原Snowflake:
1位:符号位,始终为0,表示正数。
41位:时间戳(毫秒精度),从某个固定的时间点开始计算,如2010年1月1日0时0分0秒。
10位:工作机器ID,可以标识不同的服务器节点。
12位:序列号,用于同一毫秒内生成的不同ID
因此,Sonyflake 具有以下优点和缺点:
寿命(174年)比雪花(69年)更长
它可以在比 Snowflake(2^10)更多的分布式机器(2^16)上工作
它最多可以在单台机器/线程中每 10 毫秒生成 2^8 个 ID(比 Snowflake 慢)
因为去掉了符号位,生成类型为uint64,postgresql不支持(postgresql不支持无符号数,虽然说是pg的缺点...)
但是,如果您希望在单个主机中获得更高的生成率,则可以使用 goroutines 轻松地同时运行多个 Sonyflake ID 生成器。
go get github.com/sony/sonyflakepackage main
import (
"fmt"
"github.com/sony/sonyflake"
"time"
)
var st = time.Date(2025, 2, 8, 0, 0, 0, 0, time.UTC)
func main() {
cli := sonyflake.NewSonyflake(sonyflake.Settings{
StartTime: st, //开始时间,早于当前时间,固定值
MachineID: nil,//获取MachineID的函数,为空使用默认值
CheckMachineID: nil,//获取CheckMachineID的函数,为空使用默认值
})
for i := 0; i < 1000; i++ {
id, err := cli.NextID()
if err != nil {
panic(err)
}
fmt.Println(id)
}
}