copy langext & termext from ffsclient
This commit is contained in:
134
langext/uuid.go
Normal file
134
langext/uuid.go
Normal file
@@ -0,0 +1,134 @@
|
||||
package langext
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"encoding/hex"
|
||||
"io"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func NewUUID() ([16]byte, error) {
|
||||
var uuid [16]byte
|
||||
_, err := io.ReadFull(rand.Reader, uuid[:])
|
||||
if err != nil {
|
||||
return [16]byte{}, err
|
||||
}
|
||||
uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4
|
||||
uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10
|
||||
return uuid, nil
|
||||
}
|
||||
|
||||
func NewHexUUID() (string, error) {
|
||||
uuid, err := NewUUID()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Result: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
|
||||
var dst = make([]byte, 36)
|
||||
|
||||
hex.Encode(dst, uuid[:4])
|
||||
dst[8] = '-'
|
||||
hex.Encode(dst[9:13], uuid[4:6])
|
||||
dst[13] = '-'
|
||||
hex.Encode(dst[14:18], uuid[6:8])
|
||||
dst[18] = '-'
|
||||
hex.Encode(dst[19:23], uuid[8:10])
|
||||
dst[23] = '-'
|
||||
hex.Encode(dst[24:], uuid[10:])
|
||||
|
||||
return string(dst), nil
|
||||
}
|
||||
|
||||
func NewUpperHexUUID() (string, error) {
|
||||
uuid, err := NewUUID()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Result: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
|
||||
|
||||
var dst = make([]byte, 36)
|
||||
|
||||
hex.Encode(dst, uuid[:4])
|
||||
dst[8] = '-'
|
||||
hex.Encode(dst[9:13], uuid[4:6])
|
||||
dst[13] = '-'
|
||||
hex.Encode(dst[14:18], uuid[6:8])
|
||||
dst[18] = '-'
|
||||
hex.Encode(dst[19:23], uuid[8:10])
|
||||
dst[23] = '-'
|
||||
hex.Encode(dst[24:], uuid[10:])
|
||||
|
||||
return strings.ToUpper(string(dst)), nil
|
||||
}
|
||||
|
||||
func NewRawHexUUID() (string, error) {
|
||||
uuid, err := NewUUID()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Result: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
|
||||
var dst = make([]byte, 32)
|
||||
|
||||
hex.Encode(dst, uuid[:4])
|
||||
hex.Encode(dst[8:12], uuid[4:6])
|
||||
hex.Encode(dst[12:16], uuid[6:8])
|
||||
hex.Encode(dst[16:20], uuid[8:10])
|
||||
hex.Encode(dst[20:], uuid[10:])
|
||||
|
||||
return strings.ToUpper(string(dst)), nil
|
||||
}
|
||||
|
||||
func NewBracesUUID() (string, error) {
|
||||
uuid, err := NewUUID()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Result: {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
|
||||
|
||||
var dst = make([]byte, 38)
|
||||
|
||||
dst[0] = '{'
|
||||
hex.Encode(dst, uuid[:5])
|
||||
dst[9] = '-'
|
||||
hex.Encode(dst[10:14], uuid[4:6])
|
||||
dst[14] = '-'
|
||||
hex.Encode(dst[15:19], uuid[6:8])
|
||||
dst[19] = '-'
|
||||
hex.Encode(dst[20:24], uuid[8:10])
|
||||
dst[24] = '-'
|
||||
hex.Encode(dst[25:], uuid[10:])
|
||||
dst[37] = '}'
|
||||
|
||||
return strings.ToUpper(string(dst)), nil
|
||||
}
|
||||
|
||||
func NewParensUUID() (string, error) {
|
||||
uuid, err := NewUUID()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Result: (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)
|
||||
|
||||
var dst = make([]byte, 38)
|
||||
|
||||
dst[0] = '('
|
||||
hex.Encode(dst, uuid[:5])
|
||||
dst[9] = '-'
|
||||
hex.Encode(dst[10:14], uuid[4:6])
|
||||
dst[14] = '-'
|
||||
hex.Encode(dst[15:19], uuid[6:8])
|
||||
dst[19] = '-'
|
||||
hex.Encode(dst[20:24], uuid[8:10])
|
||||
dst[24] = '-'
|
||||
hex.Encode(dst[25:], uuid[10:])
|
||||
dst[37] = ')'
|
||||
|
||||
return strings.ToUpper(string(dst)), nil
|
||||
}
|
Reference in New Issue
Block a user