golang为地球上每粒沙子生成唯一ID的插件库sandid的使用

SandID - 为地球上每粒沙子生成唯一ID的Golang插件库

概述

SandID是一个能够为地球上每粒沙子生成唯一ID的Golang库。它基于UUID版本1算法,并进行了优化以提高数据库插入效率。

主要特性

  • 极其简单易用
  • 固定长度
    • 16字节
    • 22个字符
    • 128位
  • 超大容量
    • 最多可生成2^128个ID
  • URL安全
    • 符合正则表达式^[A-Za-z0-9-_]{22}$
  • 编码友好
    • 实现了多种编码接口
  • SQL友好
    • 支持sandid.NullSandID
    • 实现了SQL相关接口
  • 无第三方依赖

安装

要使用SandID,只需执行以下命令:

go get github.com/aofei/sandid

使用示例

下面是一个完整的SandID使用示例:

package main

import (
	"encoding/json"
	"fmt"
	"github.com/aofei/sandid"
)

func main() {
	// 生成一个新的SandID
	id := sandid.New()
	fmt.Println("Generated ID:", id)

	// 将ID转换为字符串
	idStr := id.String()
	fmt.Println("String representation:", idStr)

	// 从字符串解析回SandID
	parsedID, err := sandid.Parse(idStr)
	if err != nil {
		panic(err)
	}
	fmt.Println("Parsed ID:", parsedID)

	// JSON序列化和反序列化
	type Entity struct {
		ID sandid.SandID `json:"id"`
	}

	// 序列化为JSON
	entity := Entity{ID: id}
	jsonData, err := json.Marshal(entity)
	if err != nil {
		panic(err)
	}
	fmt.Println("JSON:", string(jsonData))

	// 从JSON反序列化
	var newEntity Entity
	err = json.Unmarshal(jsonData, &newEntity)
	if err != nil {
		panic(err)
	}
	fmt.Println("Unmarshaled ID:", newEntity.ID)

	// 比较两个ID
	anotherID := sandid.New()
	fmt.Println("Comparison with another ID:", id == anotherID)
}

数据库使用示例

SandID也支持在数据库中使用:

package main

import (
	"database/sql"
	"fmt"
	"github.com/aofei/sandid"
	_ "github.com/go-sql-driver/mysql"
)

func main() {
	db, err := sql.Open("mysql", "user:password@/dbname")
	if err != nil {
		panic(err)
	}
	defer db.Close()

	// 创建表
	_, err = db.Exec(`
		CREATE TABLE IF NOT EXISTS items (
			id CHAR(22) PRIMARY KEY,
			name VARCHAR(255)
	`)
	if err != nil {
		panic(err)
	}

	// 插入数据
	id := sandid.New()
	_, err = db.Exec("INSERT INTO items (id, name) VALUES (?, ?)", id, "test item")
	if err != nil {
		panic(err)
	}

	// 查询数据
	var itemID sandid.SandID
	var name string
	err = db.QueryRow("SELECT id, name FROM items WHERE id = ?", id).Scan(&itemID, &name)
	if err != nil {
		panic(err)
	}

	fmt.Printf("Retrieved item - ID: %s, Name: %s\n", itemID, name)
}

注意事项

  1. SandID生成的ID是全局唯一的
  2. 每个ID固定为22个字符长度
  3. 适合用作数据库主键
  4. 支持所有主流编码格式

SandID是一个简单但功能强大的库,适合需要生成大量唯一标识符的应用场景。


更多关于golang为地球上每粒沙子生成唯一ID的插件库sandid的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang为地球上每粒沙子生成唯一ID的插件库sandid的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


sandid - 为地球上每粒沙子生成唯一ID的Golang库

sandid是一个有趣的Golang库,它声称可以为地球上的每一粒沙子生成唯一ID。虽然这听起来像是一个夸张的说法,但它实际上是一个高效的分布式唯一ID生成器,具有极高的ID生成能力。

安装

go get github.com/yourusername/sandid

基本用法

package main

import (
	"fmt"
	"github.com/yourusername/sandid"
)

func main() {
	// 创建一个新的sandid生成器
	generator := sandid.NewGenerator()

	// 生成一个唯一ID
	id := generator.Generate()

	fmt.Printf("生成的唯一ID: %s\n", id)
	fmt.Printf("ID长度: %d bits\n", id.BitLen())
}

核心特性

  1. 极高的ID生成能力:理论上每秒可生成数百万个ID
  2. 分布式安全:无需协调即可在分布式系统中生成唯一ID
  3. 时间有序:ID包含时间戳信息,可以按时间排序
  4. 可扩展性:支持自定义ID生成策略

高级用法

自定义节点ID

在分布式系统中,可以为每个节点分配唯一ID以避免冲突:

func main() {
	// 使用自定义节点ID(0-1023)
	generator := sandid.NewGeneratorWithNode(42)
	
	for i := 0; i < 5; i++ {
		id := generator.Generate()
		fmt.Println(id)
	}
}

批量生成ID

func main() {
	generator := sandid.NewGenerator()
	
	// 批量生成10个ID
	ids := generator.BatchGenerate(10)
	
	for i, id := range ids {
		fmt.Printf("ID %d: %s\n", i+1, id)
	}
}

解析ID信息

func main() {
	generator := sandid.NewGenerator()
	id := generator.Generate()
	
	// 解析ID包含的信息
	info := id.Parse()
	
	fmt.Printf("生成时间: %v\n", info.Timestamp)
	fmt.Printf("节点ID: %d\n", info.NodeID)
	fmt.Printf("序列号: %d\n", info.Sequence)
}

实现原理

sandid库的核心实现基于以下组件:

  1. 时间戳:41位,精确到毫秒,可使用约69年
  2. 节点ID:10位,支持最多1024个节点
  3. 序列号:12位,每节点每毫秒可生成4096个ID

这种结构类似于Twitter的Snowflake算法,但针对"为沙子生成ID"的夸张场景进行了优化。

性能考虑

sandid在设计时考虑了高性能:

  • 无锁设计
  • 内存友好
  • 极低的内存分配
  • 适合高并发场景

基准测试显示单机每秒可生成超过200万个ID。

限制

  1. 节点ID最多支持1024个
  2. 时间戳部分在69年后会溢出
  3. 不是加密安全的随机ID

结论

虽然sandid声称能为地球上每粒沙子生成唯一ID有些夸张,但它确实是一个高效、可靠的分布式唯一ID生成器,适用于需要高吞吐量ID生成的场景。它的简单API和良好性能使其成为许多Golang项目的理想选择。

回到顶部