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)
}
注意事项
- SandID生成的ID是全局唯一的
- 每个ID固定为22个字符长度
- 适合用作数据库主键
- 支持所有主流编码格式
SandID是一个简单但功能强大的库,适合需要生成大量唯一标识符的应用场景。
更多关于golang为地球上每粒沙子生成唯一ID的插件库sandid的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于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())
}
核心特性
- 极高的ID生成能力:理论上每秒可生成数百万个ID
- 分布式安全:无需协调即可在分布式系统中生成唯一ID
- 时间有序:ID包含时间戳信息,可以按时间排序
- 可扩展性:支持自定义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
库的核心实现基于以下组件:
- 时间戳:41位,精确到毫秒,可使用约69年
- 节点ID:10位,支持最多1024个节点
- 序列号:12位,每节点每毫秒可生成4096个ID
这种结构类似于Twitter的Snowflake算法,但针对"为沙子生成ID"的夸张场景进行了优化。
性能考虑
sandid
在设计时考虑了高性能:
- 无锁设计
- 内存友好
- 极低的内存分配
- 适合高并发场景
基准测试显示单机每秒可生成超过200万个ID。
限制
- 节点ID最多支持1024个
- 时间戳部分在69年后会溢出
- 不是加密安全的随机ID
结论
虽然sandid
声称能为地球上每粒沙子生成唯一ID有些夸张,但它确实是一个高效、可靠的分布式唯一ID生成器,适用于需要高吞吐量ID生成的场景。它的简单API和良好性能使其成为许多Golang项目的理想选择。