github.com/inflatablewoman/deis@v1.0.1-0.20141111034523-a4511c46a6ce/deisctl/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/uuid.go (about) 1 // Copyright 2011 Google Inc. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package uuid 6 7 import ( 8 "bytes" 9 "crypto/rand" 10 "fmt" 11 "io" 12 "strings" 13 ) 14 15 // A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC 16 // 4122. 17 type UUID []byte 18 19 // A Version represents a UUIDs version. 20 type Version byte 21 22 // A Variant represents a UUIDs variant. 23 type Variant byte 24 25 // Constants returned by Variant. 26 const ( 27 Invalid = Variant(iota) // Invalid UUID 28 RFC4122 // The variant specified in RFC4122 29 Reserved // Reserved, NCS backward compatibility. 30 Microsoft // Reserved, Microsoft Corporation backward compatibility. 31 Future // Reserved for future definition. 32 ) 33 34 var rander = rand.Reader // random function 35 36 // New returns a new random (version 4) UUID as a string. It is a convenience 37 // function for NewRandom().String(). 38 func New() string { 39 return NewRandom().String() 40 } 41 42 // Parse decodes s into a UUID or returns nil. Both the UUID form of 43 // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and 44 // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded. 45 func Parse(s string) UUID { 46 if len(s) == 36+9 { 47 if strings.ToLower(s[:9]) != "urn:uuid:" { 48 return nil 49 } 50 s = s[9:] 51 } else if len(s) != 36 { 52 return nil 53 } 54 if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { 55 return nil 56 } 57 uuid := make([]byte, 16) 58 for i, x := range []int{ 59 0, 2, 4, 6, 60 9, 11, 61 14, 16, 62 19, 21, 63 24, 26, 28, 30, 32, 34} { 64 if v, ok := xtob(s[x:]); !ok { 65 return nil 66 } else { 67 uuid[i] = v 68 } 69 } 70 return uuid 71 } 72 73 // Equal returns true if uuid1 and uuid2 are equal. 74 func Equal(uuid1, uuid2 UUID) bool { 75 return bytes.Equal(uuid1, uuid2) 76 } 77 78 // String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 79 // , or "" if uuid is invalid. 80 func (uuid UUID) String() string { 81 if uuid == nil || len(uuid) != 16 { 82 return "" 83 } 84 b := []byte(uuid) 85 return fmt.Sprintf("%08x-%04x-%04x-%04x-%012x", 86 b[:4], b[4:6], b[6:8], b[8:10], b[10:]) 87 } 88 89 // URN returns the RFC 2141 URN form of uuid, 90 // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, or "" if uuid is invalid. 91 func (uuid UUID) URN() string { 92 if uuid == nil || len(uuid) != 16 { 93 return "" 94 } 95 b := []byte(uuid) 96 return fmt.Sprintf("urn:uuid:%08x-%04x-%04x-%04x-%012x", 97 b[:4], b[4:6], b[6:8], b[8:10], b[10:]) 98 } 99 100 // Variant returns the variant encoded in uuid. It returns Invalid if 101 // uuid is invalid. 102 func (uuid UUID) Variant() Variant { 103 if len(uuid) != 16 { 104 return Invalid 105 } 106 switch { 107 case (uuid[8] & 0xc0) == 0x80: 108 return RFC4122 109 case (uuid[8] & 0xe0) == 0xc0: 110 return Microsoft 111 case (uuid[8] & 0xe0) == 0xe0: 112 return Future 113 default: 114 return Reserved 115 } 116 panic("unreachable") 117 } 118 119 // Version returns the verison of uuid. It returns false if uuid is not 120 // valid. 121 func (uuid UUID) Version() (Version, bool) { 122 if len(uuid) != 16 { 123 return 0, false 124 } 125 return Version(uuid[6] >> 4), true 126 } 127 128 func (v Version) String() string { 129 if v > 15 { 130 return fmt.Sprintf("BAD_VERSION_%d", v) 131 } 132 return fmt.Sprintf("VERSION_%d", v) 133 } 134 135 func (v Variant) String() string { 136 switch v { 137 case RFC4122: 138 return "RFC4122" 139 case Reserved: 140 return "Reserved" 141 case Microsoft: 142 return "Microsoft" 143 case Future: 144 return "Future" 145 case Invalid: 146 return "Invalid" 147 } 148 return fmt.Sprintf("BadVariant%d", int(v)) 149 } 150 151 // SetRand sets the random number generator to r, which implents io.Reader. 152 // If r.Read returns an error when the package requests random data then 153 // a panic will be issued. 154 // 155 // Calling SetRand with nil sets the random number generator to the default 156 // generator. 157 func SetRand(r io.Reader) { 158 if r == nil { 159 rander = rand.Reader 160 return 161 } 162 rander = r 163 }