mirror of
https://github.com/duke-git/lancet.git
synced 2026-03-01 00:35:28 +08:00
feat: add func UUIdV4
This commit is contained in:
@@ -6,6 +6,7 @@ package random
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
crand "crypto/rand"
|
crand "crypto/rand"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"time"
|
"time"
|
||||||
@@ -48,3 +49,18 @@ func RandBytes(length int) []byte {
|
|||||||
}
|
}
|
||||||
return b
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -47,3 +47,16 @@ func TestRandBytes(t *testing.T) {
|
|||||||
|
|
||||||
assert.Equal([]byte{}, RandBytes(0))
|
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))
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user