diff --git a/docs/random.md b/docs/random.md index 3f751aa..4cf260c 100644 --- a/docs/random.md +++ b/docs/random.md @@ -23,6 +23,7 @@ import ( - [RandBytes](#RandBytes) - [RandInt](#RandInt) - [RandString](#RandString) +- [UUIdV4](#UUIdV4)
@@ -105,3 +106,33 @@ func main() { ``` + + +### UUIdV4 +

Generate a random UUID of version 4 according to RFC 4122.

+ +Signature: + +```go +func UUIdV4() (string, error) +``` +Example: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/random" +) + +func main() { + uuid, err := random.UUIdV4() + if err != nil { + return + } + fmt.Println(uuid) +} +``` + + diff --git a/docs/random_zh-CN.md b/docs/random_zh-CN.md index b69f4aa..e3ff93e 100644 --- a/docs/random_zh-CN.md +++ b/docs/random_zh-CN.md @@ -23,6 +23,8 @@ import ( - [RandBytes](#RandBytes) - [RandInt](#RandInt) - [RandString](#RandString) +- [UUIdV4](#UUIdV4) +
@@ -105,3 +107,32 @@ func main() { ``` + +### UUIdV4 +

生成UUID v4字符串

+ +函数签名: + +```go +func UUIdV4() (string, error) +``` +例子: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/random" +) + +func main() { + uuid, err := random.UUIdV4() + if err != nil { + return + } + fmt.Println(uuid) +} +``` + + 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)) +}