Go 之 id 生成器 shortid、snowflake

本文介绍了两种生成短小、唯一且适合URL的ID方法:shortid和Twitter的snowflake算法。shortid适用于简单场景,而snowflake提供更丰富的信息和高并发支持,常用于分布式系统中生成全局唯一的ID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、shortid

简短、唯一、非连续且URL友好的id生成器

参考链接:GitHub - teris-io/shortid: Super short, fully unique, non-sequential and URL friendly Ids

使用示例:

package main

import (
	"fmt"
	"github.com/teris-io/shortid"
	"time"
)

/*
*
生成 id
github地址:https://github.com/teris-io/shortid
*/

func testShortid1() {
	value, err := shortid.Generate()
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(value) // 例如:
}

func testShortid2() {
	shortId := shortid.MustNew(2, shortid.DefaultABC, uint64(time.Now().UnixNano()))
	value, err := shortId.Generate()
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println(value)
}

func main() {
	// testShortid1()
	testShortid2()
}

二、snowflake(推荐学习使用)

推特开源的雪花算法id生成器

参考链接:GitHub - bwmarrin/snowflake: A simple to use Go (golang) package to generate or parse Twitter snowflake IDs

使用示例:

package main

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

// Snowflake 包提供了以下功能:
// 一个非常简单的 Twitter 雪花生成器
// 解析现有雪花 ID 的方法
// 将雪花 ID 转换为多种其他数据类型并返回的方法
// JSON Marshal/Unmarshal 函数可在 JSON API 中轻松使用雪花 ID
// 单调时钟计算可防止时钟偏移
//
// 默认情况下,生成的 id 有以下格式:
// 整个 ID 是一个 63 位整数,存储在 int64 中
// 41 位用于存储毫秒精度的时间戳,使用自定义纪元
// 10 位用于存储节点 ID 范围从 0 - 1023
// 12 位用于存储序列号 范围从0 - 4095
// 因此,其生成的 int64 的 id 长度为 19 位。
// +--------------------------------------------------------------------------+
// | 1 Bit Unused | 41 Bit Timestamp |  10 Bit NodeID  |   12 Bit Sequence ID |
// +--------------------------------------------------------------------------+

func testSnowflake1() {
	// Create a new Node with a Node number of 1
	node, err := snowflake.NewNode(1)
	if err != nil {
		fmt.Println(err)
		return
	}

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

	fmt.Println("id ---->  ", int64(id))

	for i := 0; i < 10; i++ {
		// 生成连续的 id
		fmt.Println(int64(node.Generate()))
	}
}
func main() {
	testSnowflake1()
}

// Snowflake 库通常用于需要生成唯一 ID 的场景,例如分布式系统中的分布式 ID 生成器、消息队列中的消息 ID 生成器、分布式锁中的锁 ID 生成器等。在这些场景中,需要生成的 ID 必须是全局唯一的,以避免出现 ID 冲突的情况。
//
// Snowflake 库生成的 ID 是一个 64 位的整数,其中包含了时间戳、节点 ID 和序列号等信息,这些信息可以用来保证 ID 的唯一性。同时,Snowflake 库的生成速度非常快,可以在高并发的环境下快速生成大量的 ID。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值