雪花算法生成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)
}
相关推荐
heartbeat..1 小时前
JavaWeb 核心:HttpServletRequest 请求行、请求头、请求参数完整梳理
java·网络·web·request
钦拆大仁5 小时前
聊一聊跨域错误CORS
web·跨域
DICOM医学影像7 小时前
14. Go-Ethereum测试Solidity ERC20合约 - Go-Ethereum调用区块链方法
开发语言·golang·go·区块链·solidity·以太坊·go-ethereum
锦瑟弦音9 小时前
go2rtc实现获取rtsp视频到vue
go
曲幽1 天前
一文理清FastAPI参数:从Query、Path到BaseModel的实战指南
python·fastapi·web·form·request·path·body·query·basemodel
王中阳Go2 天前
手把手教你用 Go + Eino 搭建一个企业级 RAG 知识库(含代码与踩坑)
人工智能·后端·go
ShoreKiten2 天前
ctfshow-web165(会一题通一类保姆级wp)
web
hssfscv2 天前
Javaweb学习笔记——Web
笔记·学习·web
ChineHe2 天前
Gin框架基础篇009_日志中间件详解
golang·web·gin
曲幽2 天前
掌握Fetch与Flask交互:让前端表单提交更优雅的动态之道
python·flask·json·web·post·fetch·response