雪花算法生成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 分钟前
使用 Makefile 和 Docker 简化你的 Go 服务部署流程
后端·go
HyggeBest16 小时前
Golang 并发原语 Sync Pool
后端·go
来杯咖啡16 小时前
使用 Go 语言别在反向优化 MD5
后端·go
郭京京1 天前
redis基本操作
redis·go
郭京京1 天前
go操作redis
redis·后端·go
你的人类朋友1 天前
说说你对go的认识
后端·云原生·go
OEC小胖胖2 天前
【React 设计模式】受控与非受控:解构 React 组件设计的核心模式
前端·react.js·设计模式·前端框架·web
用户580559502102 天前
channel原理解析(流程图+源码解读)
go
蒋星熠2 天前
全栈开发:从LAMP到云原生的技术革命
微服务·云原生·职场和发展·架构·系统架构·web·devops
HiWorld2 天前
Go源码学习(基于1.24.1)-slice扩容机制-实践才是真理
go