golang下的UUID生成

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 包括标准的UUID,snowflake,MongoDB ObjectID等等。。

golang软件包列表

软件包 样例 格式
ksuid 0pPKHjWprnVxGH7dEsAoXX2YQvU 4 bytes of time (seconds) + 16 random bytes
xid b50vl5e54p1000fo3gh0 4 bytes of time (seconds) + 3 byte machine id + 2 byte process id + 3 bytes random
betterguid -N-35bz_wVbhxzTZD2wO 8 bytes of time (milliseconds) + 9 random bytes
sonyflake 402329004549341446 ~6 bytes of time (10 ms) + 1 byte sequence + 2 bytes machine id
snowflake 1512052461246971904 1 Bit Unused + 41 Bit Timestamp + 10 Bit NodeID + 12 Bit Sequence ID
snowflake 1512052461246971904 1 Bit Unused + 41 Bit Timestamp + 10 Bit NodeID + 12 Bit Sequence ID
ulid 01BJMVNPBBZC3E36FJTGVF0C4S 6 bytes of time (milliseconds) + 8 bytes random
sid 1JADkqpWxPx-4qaWY47~FqI 8 bytes of time (ns) + 8 random bytes
shortuuid dwRQAc68PhHQh4BUnrNsoS UUIDv4 or v5, encoded in a more compact way
go.uuid 5b52d72c-82b3-4f8e-beb5-437a974842c UUIDv4 from RFC 4112 for comparison
google.uuid dd5f48eb-1722-4e5f-9d56-dcaf0aae1026 UUIDv4
bomberman.uuid 330806cf-684c-43f7-85aa-79939ed3415d UUIDv4
MongoDB ObjectID 624ee0fb37583f00042dc309 4-byte timestamp + 5-byte random value + 3-byte incrementing counter

代码

package main

import (
    "fmt"
    "log"
    "math/rand"
    "time"

    "github.com/bwmarrin/snowflake"
    "github.com/chilts/sid"
    goSnowflake "github.com/godruoyi/go-snowflake"
    guuid "github.com/google/uuid"
    "github.com/kjk/betterguid"
    "github.com/lithammer/shortuuid"
    "github.com/oklog/ulid"
    pborman "github.com/pborman/uuid"
    "github.com/rs/xid"
    goUUID "github.com/satori/go.uuid"
    "github.com/segmentio/ksuid"
    "github.com/sony/sonyflake"
    "go.mongodb.org/mongo-driver/bson/primitive"
)

func genShortUUID() {
    id := shortuuid.New()
    fmt.Printf("github.com/lithammer/shortuuid: %s\n", id)
}

func genXid() {
    id := xid.New()
    fmt.Printf("github.com/rs/xid:              %s\n", id.String())
}

func genKsuid() {
    id := ksuid.New()
    fmt.Printf("github.com/segmentio/ksuid:     %s\n", id.String())
}

func genBetterGUID() {
    id := betterguid.New()
    fmt.Printf("github.com/kjk/betterguid:      %s\n", id)
}

func genUlid() {
    t := time.Now().UTC()
    entropy := rand.New(rand.NewSource(t.UnixNano()))
    id := ulid.MustNew(ulid.Timestamp(t), entropy)
    fmt.Printf("github.com/oklog/ulid:          %s\n", id.String())
}

func genSonyflake() {
    flake := sonyflake.NewSonyflake(sonyflake.Settings{})
    id, err := flake.NextID()
    if err != nil {
        log.Fatalf("flake.NextID() failed with %s\n", err)
    }
    // Note: this is base16, could shorten by encoding as base62 string
    fmt.Printf("github.com/sony/sonyflake:      %d\n", id)
}

func genSnowflake() {
    nodeId := rand.Int63() % 1023
    node, err := snowflake.NewNode(nodeId)
    if err != nil {
        log.Fatalf("snowflake.NewNode() failed with %s\n", err)
    }

    id := node.Generate().Int64()
    fmt.Printf("github.com/bwmarrin/snowflake:      %d\n", id)
}

func genGoSnowflake() {
    id := goSnowflake.ID()
    fmt.Printf("github.com/godruoyi/go-snowflake:      %d\n", id)
}

func genSid() {
    id := sid.Id()
    fmt.Printf("github.com/chilts/sid:          %s\n", id)
}

func genUUIDv4() {
    id := goUUID.NewV4()
    fmt.Printf("github.com/satori/go.uuid:      %s\n", id)
}

func genUUID() {
    id := guuid.New()
    fmt.Printf("github.com/google/uuid:         %s\n", id.String())
}

func genPbormanUUID() {
    id := pborman.NewRandom()
    fmt.Printf("github.com/pborman/uuid:         %s\n", id.String())
}

func genMongoDBObjectID() {
    id := primitive.NewObjectID()
    fmt.Printf("go.mongodb.org/mongo-driver/bson/primitive:         %s\n", id.Hex())
}

func main() {
    genXid()
    genKsuid()
    genBetterGUID()
    genUlid()
    genSonyflake()
    genSnowflake()
    genGoSnowflake()
    genSid()
    genShortUUID()
    genUUIDv4()
    genUUID()
    genPbormanUUID()
    genMongoDBObjectID()
}

参考资料

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
Golang: satori/go.uuid库生成UUID
Golang: satori/go.uuid库生成UUID
296 0
|
3月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
144 4
Golang语言之管道channel快速入门篇
|
3月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
72 4
Golang语言文件操作快速入门篇
|
3月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
119 3
Golang语言之gRPC程序设计示例
|
3月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
101 4
|
3月前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
55 3
|
3月前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
79 4
Golang语言goroutine协程篇
|
3月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
81 3
Golang语言之Prometheus的日志模块使用案例
|
3月前
|
Go
Golang语言之函数(func)进阶篇
这篇文章是关于Golang语言中函数高级用法的教程,涵盖了初始化函数、匿名函数、闭包函数、高阶函数、defer关键字以及系统函数的使用和案例。
75 3
Golang语言之函数(func)进阶篇
|
2月前
|
前端开发 中间件 Go
实践Golang语言N层应用架构
【10月更文挑战第2天】本文介绍了如何在Go语言中使用Gin框架实现N层体系结构,借鉴了J2EE平台的多层分布式应用程序模型。文章首先概述了N层体系结构的基本概念,接着详细列出了Go语言中对应的构件名称,包括前端框架(如Vue.js、React)、Gin的处理函数和中间件、依赖注入和配置管理、会话管理和ORM库(如gorm或ent)。最后,提供了具体的代码示例,展示了如何实现HTTP请求处理、会话管理和数据库操作。
38 0