go的雪花算法代码分享

雪花算法

  • [分布式 ID 分布式 ID:](#分布式 ID 分布式 ID:)
  • 雪花算法

分布式 ID 分布式 ID:

  1. 全局唯一性
  2. 递增性
  3. 高可用性
  4. 高性能性

雪花算法

是由 Twitter 开源的由 64 位整数组成分布式的 ID, 性能较高,并且在单机上递增

  1. github.com/bwmarrin/snowflake
    package main
go 复制代码
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)

}
  1. github.com/sony/sonyflake
go 复制代码
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)

}
相关推荐
小徐不徐说9 小时前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
ZhengEnCi9 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
ragnwang9 小时前
Notes: Python pybind11 import C++ module
开发语言·c++·python
王中阳Go9 小时前
后端转 Agent 岗面试怎么答:8 个高频问题与应答口径
人工智能·后端·python·大语言模型
Wang's Blog9 小时前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
程序猿DD9 小时前
OctaFuse Gateway 2.18.0:MCP 接入支持 OAuth,供应商粘性绑定可视化管理
后端
骑着蜗牛撵大象32710 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
Dxy123931021611 小时前
JS DES 加密详解
开发语言·javascript·arcgis
充值内卷11 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
云和数据.ChenGuang11 小时前
深入解析 Python 的 dir():从用法到 CPython 源码实现
开发语言·人工智能·python·langchain