github.com/jrperritt/terraform@v0.1.1-0.20170525065507-96f391dafc38/helper/resource/id.go (about) 1 package resource 2 3 import ( 4 "crypto/rand" 5 "fmt" 6 "math/big" 7 "sync" 8 ) 9 10 const UniqueIdPrefix = `terraform-` 11 12 // idCounter is a randomly seeded monotonic counter for generating ordered 13 // unique ids. It uses a big.Int so we can easily increment a long numeric 14 // string. The max possible hex value here with 12 random bytes is 15 // "01000000000000000000000000", so there's no chance of rollover during 16 // operation. 17 var idMutex sync.Mutex 18 var idCounter = big.NewInt(0).SetBytes(randomBytes(12)) 19 20 // Helper for a resource to generate a unique identifier w/ default prefix 21 func UniqueId() string { 22 return PrefixedUniqueId(UniqueIdPrefix) 23 } 24 25 // Helper for a resource to generate a unique identifier w/ given prefix 26 // 27 // After the prefix, the ID consists of an incrementing 26 digit value (to match 28 // previous timestamp output). 29 func PrefixedUniqueId(prefix string) string { 30 idMutex.Lock() 31 defer idMutex.Unlock() 32 return fmt.Sprintf("%s%026x", prefix, idCounter.Add(idCounter, big.NewInt(1))) 33 } 34 35 func randomBytes(n int) []byte { 36 b := make([]byte, n) 37 rand.Read(b) 38 return b 39 }