UUID(通用唯一标识符)是一种用于在分布式系统中生成唯一标识的标准。通过UUID,可以确保每个元素都有一个唯一的标识信息,无需依赖中央控制端分配。这有助于避免数据库创建时的命名冲突问题。目前最广泛使用的UUID实现之一是微软的GUID(全局唯一标识符),此外,Linux ext2/ext3文件系统、LUKS加密分区、GNOME、KDE和macOS等也使用了类似的机制。
Go语言标准库中并未提供UUID相关的支持,因此需要借助第三方库来实现UUID生成功能。以下是几个常用的Go语言UUID生成库及其用法示例:
1. github.com/google/uuid
这是由Google提供的一个高质量UUID库,支持多种UUID版本的生成。
1.1 生成数字类型的UUID
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
id1 := uuid.New()
id2, _ := uuid.NewRandom()
fmt.Println(id1.ID())
fmt.Println(id2.ID())
}
1.2 生成字符串类型的UUID
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
id1 := uuid.New()
id2, _ := uuid.NewRandom()
fmt.Println(id1.String())
fmt.Println(id2.String())
}
2. github.com/satori/go.uuid
该库支持生成字符串类型的UUID,但仅限于特定版本(如V4)。
package main
import (
"fmt"
"github.com/satori/go.uuid"
)
func main() {
id := uuid.NewV4()
fmt.Println(id.String())
}
3. github.com/rs/xid
XID是一个紧凑且高效的全局唯一ID生成器,适合高性能场景。
package main
import (
"fmt"
"github.com/rs/xid"
)
func main() {
id := xid.New()
fmt.Printf("XID: %s\n", id.String())
}
4. github.com/segmentio/ksuid
KSUID(K-Sortable Unique IDentifier)是一种可排序的唯一标识符。
package main
import (
"fmt"
"github.com/segmentio/ksuid"
)
func main() {
id := ksuid.New()
fmt.Printf("KSUID: %s\n", id.String())
}
5. github.com/kjk/betterguid
BetterGUID提供了简化的GUID生成方法,适合需要更短标识符的场景。
package main
import (
"fmt"
"github.com/kjk/betterguid"
)
func main() {
id := betterguid.New()
fmt.Printf("BetterGUID: %s\n", id)
}
6. github.com/oklog/ulid
ULID(Universally Unique Lexicographically Sortable Identifier)是一种既唯一又可排序的标识符。
package main
import (
"fmt"
"math/rand"
"time"
"github.com/oklog/ulid"
)
func main() {
timestamp := ulid.Timestamp(time.Now().UTC())
entropy := rand.New(rand.NewSource(time.Now().UnixNano()))
id := ulid.MustNew(timestamp, entropy)
fmt.Printf("ULID: %s\n", id.String())
}
7. github.com/sony/sonyflake
SonyFlake是一种基于时间戳和节点ID的分布式ID生成器,类似于Twitter Snowflake。
package main
import (
"fmt"
"github.com/sony/sonyflake"
)
func main() {
flake := sonyflake.NewSonyflake(sonyflake.Settings{})
id, err := flake.NextID()
if err != nil {
fmt.Printf("Error: %v\n", err)
}
fmt.Printf("SonyFlake: %x\n", id)
}
8. github.com/chilts/sid
SID是一个轻量级的全局唯一ID生成器,适用于简单场景。
package main
import (
"fmt"
"github.com/chilts/sid"
)
func main() {
id := sid.Id()
fmt.Printf("SID: %s\n", id)
}