雪花算法
分布式ID分布式ID:
1 全局唯一性
2 递增性
3 高可用性
4 高性能性
雪花算法
是由Twitter开源的由64位整数组成分布式的ID,性能较高,并且在单机上递增
1. github.com/bwmarrin/snowflake
package main
import (
"fmt"
"time"2\. https://github.com/sony/sonyflake
sonyflake是Sony公司的⼀一个开源项⽬目,基本思路路和snowflake差不不多,不不过位分配上稍有不不同:
这⾥里里的时间只⽤用了了39个bit,但时间的单位变成了了10ms,所以理理论上⽐比41位表示的时间还要久(174年年)。
Sequence ID 和之前的定义⼀一致, Machine ID 其实就是节点id。 sonyflake 库有以下配置参数:
"github.com/bwmarrin/snowflake"
)
var node *snowflake.Node
func Init(startTime string, machineID int64) (err error) {
var st time.Time
st, err = time.Parse("2006-01-02", startTime)
if err != nil {
return
}
snowflake.Epoch = st.UnixNano() / 1000000
node, err = snowflake.NewNode(machineID)
return
}
func GenID() int64 {
return node.Generate().Int64()
}
func main() {
if err := Init("2020-07-01", 1); err != nil {
fmt.Printf("init failed, err:%v\n", err)
return
}
id := GenID()
fmt.Println(id)
}
package main
import (
"fmt"
"time"
"github.com/sony/sonyflake"
)
var (
sonyFlake *sonyflake.Sonyflake
sonyMachineID uint16
)
func getMachineID() (uint16, error) {
return sonyMachineID, nil
}
// 需传⼊入当前的机器器ID
func Init(startTime string, machineId uint16) (err error) {
sonyMachineID = machineId
var st time.Time
st, err = time.Parse("2006-01-02", startTime)
if err != nil {
return err
}
settings := sonyflake.Settings{
StartTime: st,
MachineID: getMachineID,
}
sonyFlake = sonyflake.NewSonyflake(settings)
return
}
// GenID ⽣生成id
func GenID() (id uint64, err error) {
if sonyFlake == nil {
err = fmt.Errorf("snoy flake not inited")
}
id, err = sonyFlake.NextID()
return
}
func main() {
if err := Init("2020-07-01", 1); err != nil {
fmt.Printf("Init failed, err:%v\n", err)
return
}
id, _ := GenID()
fmt.Println(id)
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: