github.com/acm1/terraform@v0.6.2-0.20150729164239-1f314444f45c/helper/resource/id.go (about) 1 package resource 2 3 import ( 4 "crypto/rand" 5 "encoding/base32" 6 "fmt" 7 "strings" 8 ) 9 10 const UniqueIdPrefix = `terraform-` 11 12 // Helper for a resource to generate a unique identifier w/ default prefix 13 func UniqueId() string { 14 return PrefixedUniqueId(UniqueIdPrefix) 15 } 16 17 // Helper for a resource to generate a unique identifier w/ given prefix 18 // 19 // This uses a simple RFC 4122 v4 UUID with some basic cosmetic filters 20 // applied (base32, remove padding, downcase) to make visually distinguishing 21 // identifiers easier. 22 func PrefixedUniqueId(prefix string) string { 23 return fmt.Sprintf("%s%s", prefix, 24 strings.ToLower( 25 strings.Replace( 26 base32.StdEncoding.EncodeToString(uuidV4()), 27 "=", "", -1))) 28 } 29 30 func uuidV4() []byte { 31 var uuid [16]byte 32 33 // Set all the other bits to randomly (or pseudo-randomly) chosen 34 // values. 35 rand.Read(uuid[:]) 36 37 // Set the two most significant bits (bits 6 and 7) of the 38 // clock_seq_hi_and_reserved to zero and one, respectively. 39 uuid[8] = (uuid[8] | 0x80) & 0x8f 40 41 // Set the four most significant bits (bits 12 through 15) of the 42 // time_hi_and_version field to the 4-bit version number from Section 4.1.3. 43 uuid[6] = (uuid[6] | 0x40) & 0x4f 44 45 return uuid[:] 46 }