package uuid
import (
"crypto/rand"
"encoding/hex"
"fmt"
"io"
)
func GenerateRandomBytes (size int ) ([]byte , error ) {
return GenerateRandomBytesWithReader (size , rand .Reader )
}
func GenerateRandomBytesWithReader (size int , reader io .Reader ) ([]byte , error ) {
if reader == nil {
return nil , fmt .Errorf ("provided reader is nil" )
}
buf := make ([]byte , size )
if _ , err := io .ReadFull (reader , buf ); err != nil {
return nil , fmt .Errorf ("failed to read random bytes: %v" , err )
}
return buf , nil
}
const uuidLen = 16
func GenerateUUID () (string , error ) {
return GenerateUUIDWithReader (rand .Reader )
}
func GenerateUUIDWithReader (reader io .Reader ) (string , error ) {
if reader == nil {
return "" , fmt .Errorf ("provided reader is nil" )
}
buf , err := GenerateRandomBytesWithReader (uuidLen , reader )
if err != nil {
return "" , err
}
return FormatUUID (buf )
}
func FormatUUID (buf []byte ) (string , error ) {
if buflen := len (buf ); buflen != uuidLen {
return "" , fmt .Errorf ("wrong length byte slice (%d)" , buflen )
}
return fmt .Sprintf ("%x-%x-%x-%x-%x" ,
buf [0 :4 ],
buf [4 :6 ],
buf [6 :8 ],
buf [8 :10 ],
buf [10 :16 ]), nil
}
func ParseUUID (uuid string ) ([]byte , error ) {
if len (uuid ) != 2 * uuidLen + 4 {
return nil , fmt .Errorf ("uuid string is wrong length" )
}
if uuid [8 ] != '-' ||
uuid [13 ] != '-' ||
uuid [18 ] != '-' ||
uuid [23 ] != '-' {
return nil , fmt .Errorf ("uuid is improperly formatted" )
}
hexStr := uuid [0 :8 ] + uuid [9 :13 ] + uuid [14 :18 ] + uuid [19 :23 ] + uuid [24 :36 ]
ret , err := hex .DecodeString (hexStr )
if err != nil {
return nil , err
}
if len (ret ) != uuidLen {
return nil , fmt .Errorf ("decoded hex is the wrong length" )
}
return ret , nil
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .