]>
Commit | Line | Data |
---|---|---|
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 | } |