微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

[转]GO UUID

Here is a simple UUID generator,it uses version 4,Pseudo Random,as described inRFC 4122

uuid.go


package uuid

import (
 "encoding/hex"
 "crypto/rand"
)

func GenUUID() (string,error) {
 uuid := make([]byte,16)
 n,err := rand.Read(uuid)
 if n != len(uuid) || err != nil {
 return "",err
 }
 // Todo: verify the two lines implement RFC 4122 correctly
 uuid[8] = 0x80 // variant bits see page 5
 uuid[4] = 0x40 // version 4 Pseudo Random,see page 7

 return hex.EncodetoString(uuid),nil
}
uuid_test.go



package uuid

import (
 "testing"
 )

func TestUUID(t *testing.T) {
    uuid,err := GenUUID()
    if  err != nil {
        t.Fatalf("GenUUID error %s",err)
    }
    t.Logf("uuid[%s]\n",uuid)
}

func BenchmarkUUID(b *testing.B) {
    m := make(map[string]int,1000) 
    for i := 0; i < b.N; i++ {
       uuid,err := GenUUID()
       if  err != nil {
        b.Fatalf("GenUUID error %s",err)
       } 
       b.StopTimer()
       c := m[uuid]
       if c > 0 {
         b.Fatalf("duplicate uuid[%s] count %d",uuid,c )
       } 
       m[uuid] = c+1
       b.StartTimer()
    }
}
command to build uuid.go
go build uuid.go

command to run test & benchmark:

go test -v -bench=".*UUID" uuid.go uuid_test.go

The source code of uuid.go and uuid_test.go are attached below.

原文地址:https://www.jb51.cc/go/191358.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐