sonyflake.go 757 Bytes
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
package id

import (
	"log"
	"math/rand"
	"strconv"
	"time"

	"github.com/sony/sonyflake"
)

var sf *sonyflake.Sonyflake

const max = 1<<16 - 1

func init() {
	// 有一定的几率会产生相同的machineID
	// 比如两个引用这个包的实例,在同一个微秒被创建...
	rand.Seed(time.Now().UnixMicro())
	st := sonyflake.Settings{
		StartTime: time.Date(2022, 1, 1, 0, 0, 0, 0, time.UTC),
		MachineID: func() (uint16, error) {
			return uint16(rand.Intn(max)), nil
		},
		CheckMachineID: nil,
	}

	sf = sonyflake.NewSonyflake(st)
	if sf == nil {
		log.Panicf("sonyflake init fails")
	}
}

func Str() string {
	ui64id, _ := sf.NextID()
	return strconv.FormatUint(ui64id, 10)
}

func UInt64() uint64 {
	ui64id, _ := sf.NextID()
	return ui64id
}