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  }