Sonyflake 是一个分布式唯一 ID 生成器,灵感来自Twitter 的 Snowflake

Sonyflake 注重多主机/核心环境下的寿命和性能。因此,它与 Snowflake 的位分配不同。Sonyflake ID 由以下部分组成:


  • 39 bits for time in units of 10 msec

  • 8 bits for a sequence number

  • 16 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/sonyflake
package 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)
	}
}