go语言如何生成uuid

go get -u github.com/satori/go.uuid

package main

import (
	"github.com/satori/go.uuid"
	"fmt"
)

func main(){
     
	u1 := uuid.Must(uuid.NewV4())
	fmt.Printf("UUIDv4:%s\n", u1)

	u2, err := uuid.FromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8")
	if err != nil {
     
		fmt.Printf("Something went wrong: %s", err)
		return
	}
	fmt.Printf("Successfully parsed: %s", u2)
}

想像一下你正在开发一个记事本App。
每一条记事都需要一个唯一ID。
如果你能协调,生成唯一ID是一件非常简单的事。
最简单的方式就是通过使用数据库:使用AUTOINCREMENT属性的列,然后当你插入一条新的记事的时候,数据库将会生成一个唯一ID。
但假如你不能协调呢?
列如,你想要你的App离线的时候也能生成唯一ID,这时候它是无法连接上数据库的。
在无法协调的情况下生成唯一ID的请求通常来自于分布式系统。
一个简单的解决方案是生成一个随机ID。
假如你使用16字节长度的随机串,将不存在产生一样的随机串的几率。
这是一个常见的问题,30多年前我们为此创建了一个名为UUID / GUID的标准。
我们可以比GUID做的更好,一个好的随机唯一ID遵循以下原则:
1、唯一性:基本原则,必须满足。
2、可排序的:可以使用随机唯一ID字符串进行排序。
3、具有时间属性:同一时间内,生成的ID彼此相近。
4、随机唯一ID字符串无需转义就要以做为URL的一部份。
5、越短越好。
使用Go实现的类似代码不多,它们遵循以下规则:
1、使用时间做为ID的一部份,使ID具有时间属性。
2、使用随机数据填充剩余的部份。
3、编码唯一ID为字符串,满足可排序及URL安全的条件。

你可以刷新测试页面看看不同时间ID格式的变化。
使用不同的包生成唯一ID的实例代码:

import (
    "github.com/chilts/sid"
    "github.com/kjk/betterguid"
    "github.com/oklog/ulid"
    "github.com/rs/xid"
    "github.com/satori/go.uuid"
    "github.com/segmentio/ksuid"
    "github.com/sony/sonyflake"
)

// To run:
// go run main.go

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:   %x\n", id)
}

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

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

func main() {
    genXid()
    genKsuid()
    genBetterGUID()
    genUlid()
    genSonyflake()
    genSid()
    genUUIDv4()

文档:https://godoc.org/github.com/satori/go.uuid

你可能感兴趣的:(#,golang)