// Package uniuri generates random strings good for use in URIs to identify // unique objects. // // Example usage: // // s := uniuri.New() // s is now "apHCJBl7L1OmC57n" // // A standard string created by New() is 16 bytes in length and consists of // Latin upper and lowercase letters, and numbers (from the set of 62 allowed // characters), which means that it has ~95 bits of entropy. To get more // entropy, you can use NewLen(UUIDLen), which returns 20-byte string, giving // ~119 bits of entropy, or any other desired length. // // Functions read from crypto/rand random source, and panic if they fail to // read from it. package uniuri import "crypto/rand" const ( // Standard length of uniuri string to achive ~95 bits of entropy. StdLen = 16 // Length of uniurl string to achive ~119 bits of entropy, closest // to what can be losslessly converted to UUIDv4 (122 bits). UUIDLen = 20 ) // Standard characters allowed in uniuri string. var StdChars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890") // New returns a new random string with the standard length and standard // characters. func New() string { return NewLenChars(StdLen, StdChars) } // NewLen returns a new random string with the provided length and standard // characters. func NewLen(length int) string { return NewLenChars(length, StdChars) } // NewLenChars returns a new random string with the provided length and byte // slice of allowed characters (maximum 256). func NewLenChars(length int, chars []byte) string { b := make([]byte, length) if _, err := rand.Reader.Read(b); err != nil { panic("error reading from random source: " + err.String()) } alen := byte(len(chars)) for i, c := range b { b[i] = chars[c%alen] } return string(b) }