github.com/sentienttechnologies/studio-go-runner@v0.0.0-20201118202441-6d21f2ced8ee/internal/runner/rand_string.go (about) 1 // Copyright 2015 (c) AndrĂ¡s Belicza, licensed under cc by-sa 4.0 with attribution required. rev 2020.4.13.36581 2 3 package runner 4 5 import ( 6 "math/rand" 7 "strings" 8 "time" 9 ) 10 11 var ( 12 src = rand.NewSource(time.Now().UnixNano()) 13 ) 14 15 const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 16 const ( 17 letterIdxBits = 6 // 6 bits to represent a letter index 18 letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits 19 letterIdxMax = 63 / letterIdxBits // # of letter indices fitting in 63 bits 20 ) 21 22 // See https://stackoverflow.com/questions/22892120/how-to-generate-a-random-string-of-a-fixed-length-in-go, for an explanation 23 func randStringBytesMaskImprSrcSB(n int) string { 24 sb := strings.Builder{} 25 sb.Grow(n) 26 // A src.Int63() generates 63 random bits, enough for letterIdxMax characters! 27 for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; { 28 if remain == 0 { 29 cache, remain = src.Int63(), letterIdxMax 30 } 31 if idx := int(cache & letterIdxMask); idx < len(letterBytes) { 32 sb.WriteByte(letterBytes[idx]) 33 i-- 34 } 35 cache >>= letterIdxBits 36 remain-- 37 } 38 39 return sb.String() 40 } 41 42 func RandomString(n int) string { 43 return randStringBytesMaskImprSrcSB(n) 44 }