雪花算法生成ID

下面将简单介绍雪花算法的简单应用和在web应用中的使用。

雪花算法的组成:雪花算法是由64位组成:符号位(1)、时间戳(41)、机器码(5数据中心+5机器ID)、计数器(12)

对于雪花算法的源码可以在这里看:bwmarrin/snowflake: A simple to use Go (golang) package to generate or parse Twitter snowflake IDs

其中,应用的部分挑拣出来就是:

简单应用:

Go 复制代码
package main

// 雪花算法生成id

// 复习:雪花算法是由64位组成:符号位(1)、时间戳(41)、机器码(5[数据中心]+5[机器ID])、计数器(12)

import (
	"fmt"
	"github.com/bwmarrin/snowflake" // 雪花算法包: 基于twitter的snowflake算法实现
)

// 使用步骤:
// 1. 导包"github.com/bwmarrin/snowflake"
// 2. 使用NewNode() 创建一个节点,初始化雪花节点
// 3. 使用Generate() 生成id

func main() {
	// Node number must be between 0 and 1023 : 机器码只有10位 (2^10-1)
	node, err := snowflake.NewNode(1023)
	if err != nil {
		fmt.Println(err)
		return
	}

	// Generate a snowflake ID.
	id := node.Generate()

	// Print out the ID in a few different ways.
	fmt.Printf("Int64  ID: %d\n", id)
	fmt.Printf("String ID: %s\n", id)

}

web中应用:

Go 复制代码
package main

import (
	"fmt"
	"time"
	"github.com/bwmarrin/snowflake"
)

// 其中如果想用在一个项目中,其实这样也可以,但是还可以具备个性化,不是完全使用默认配置
// // Epoch is set to the twitter snowflake epoch of Nov 04 2010 01:42:54 UTC in milliseconds
// You may customize this to set a different epoch for your application.
//Epoch int64 = 1288834974657
// 这是默认配置,记录的是 一个时间的毫秒数,默认是 2010年11月04日 01:42:54 UTC 的时间
// 我们也可以记录自定义的时间,比如:2019年11月04日 01:42:54 UTC 的时间

var (
	// 全局节点
	snowflakeNode *snowflake.Node
)

// 二次封装 初始化节点的函数
func Init(startTime string, machineID int64) (node *snowflake.Node,err error){
	var st time.Time
	st, err = time.Parse("2006-01-02", startTime) // 将字符串转换成时间格式
	if err != nil {
		fmt.Println("startTime err:", err)
		return
	}
	snowflake.Epoch = st.UnixNano() / 1000000	// 设置自定义的时间
	node, err = snowflake.NewNode(machineID) // 传入机器码
	if err != nil {
		fmt.Println("NewNode err:", err)
		return
	}
	return 
}

// 二次封装 生成id的函数
func GenID() int64{
	return snowflakeNode.Generate().Int64()
}

func main() {
	// 初始化节点
	node, err := Init("2019-11-04", 1)
	if err != nil {
		fmt.Println("Init err:", err)
		return
	}
	snowflakeNode = node

	// 生成id
	id := GenID()
	fmt.Println("id:", id)
}
相关推荐
程序员爱钓鱼13 小时前
为什么学习 Go?Go 能做什么?
后端·面试·go
用户095367515831 天前
在系统的学习 redis 前的疑惑
redis·go
名字还没想好☜1 天前
Go 用 errgroup 管理并发子任务:错误收敛、取消传播与限流
开发语言·后端·golang·go·并发
labixiong1 天前
TypeScript 7.0 编译器用 Go 重写,速度暴增10倍——背后到底做了什么?
前端·javascript·go
名字还没想好☜2 天前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
ArixBit2 天前
用 Go 手撸 Agent 框架 #10:用自己的 Runtime,做一个研究助手
go·agent
kali-Myon2 天前
深入 MySQL 内核:从临时哈希表分配机制详解 Floor 报错注入核心原理
数据库·sql·mysql·安全·web
cocoCola916673 天前
validator库参数校验若干实用技巧
go
不会C语言的男孩3 天前
第三章:流程控制
go
名字还没想好☜3 天前
Go 的 sync.Pool 实战:复用对象把 GC 压力打下来
开发语言·后端·性能优化·golang·go