雪花算法生成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)
}
相关推荐
Pandaconda3 小时前
【Golang 面试题】每日 3 题(三十九)
开发语言·经验分享·笔记·后端·面试·golang·go
用户498249018801317 小时前
VipSearchBuilder 技术文档
go
gopher_looklook18 小时前
一个递归差点酿成的悲剧
go
shenghuiping20011 天前
SQLmap 自动注入 -02
mysql·web·sql注入·sqlmap
doubt。1 天前
【BUUCTF】BUU XSS COURSE 11
笔记·学习·安全·web安全·网络安全·web·xss
S-X-S1 天前
「2024 博客之星」自研Java框架 Sunrays-Framework 使用教程
java·rabbitmq·springboot·web·log4j2·minio·脚手架
吴佳浩2 天前
Gin 入门指南 Swagger aipfox集成
后端·go·gin
TttHhhYy2 天前
记录一个简单小需求,大屏组件的收缩与打开,无脑写法
前端·javascript·vue.js·html·web
梦幻加菲猫2 天前
加菲工具格式化XML:让数据呈现更清晰
xml·web·网页开发·xml格式化
Pandaconda3 天前
【Golang 面试题】每日 3 题(三十六)
开发语言·经验分享·笔记·后端·面试·golang·go