From a19a8615525cd4e5ec3b5721e41089ca1c0e6be2 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Sun, 20 Feb 2022 10:16:15 +0800 Subject: [PATCH] feat: add func UUIdV4 --- random/random.go | 16 ++++++++++++++++ random/random_test.go | 13 +++++++++++++ 2 files changed, 29 insertions(+) diff --git a/random/random.go b/random/random.go index ebd708d..d84f5d3 100644 --- a/random/random.go +++ b/random/random.go @@ -6,6 +6,7 @@ package random import ( crand "crypto/rand" + "fmt" "io" "math/rand" "time" @@ -48,3 +49,18 @@ func RandBytes(length int) []byte { } return b } + +// UUIdV4 generate a random UUID of version 4 according to RFC 4122 +func UUIdV4() (string, error) { + uuid := make([]byte, 16) + + n, err := io.ReadFull(crand.Reader, uuid) + if n != len(uuid) || err != nil { + return "", err + } + + uuid[8] = uuid[8]&^0xc0 | 0x80 + uuid[6] = uuid[6]&^0xf0 | 0x40 + + return fmt.Sprintf("%x-%x-%x-%x-%x", uuid[0:4], uuid[4:6], uuid[6:8], uuid[8:10], uuid[10:]), nil +} diff --git a/random/random_test.go b/random/random_test.go index 190113c..82fc19a 100644 --- a/random/random_test.go +++ b/random/random_test.go @@ -47,3 +47,16 @@ func TestRandBytes(t *testing.T) { assert.Equal([]byte{}, RandBytes(0)) } + +func TestUUIdV4(t *testing.T) { + assert := internal.NewAssert(t, "TestUUIdV4") + + uuid, err := UUIdV4() + if err != nil { + t.Log(err) + t.Fail() + } + + isUUiDV4 := regexp.MustCompile(`^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$`) + assert.Equal(true, isUUiDV4.MatchString(uuid)) +}