package nrandom import ( "math/rand" "time" "unsafe" ) // Random generate a random string based on given string range. func Random(letters string, length int) string { b := make([]byte, length) r := rand.NewSource(time.Now().UnixNano()) for i, cache, remain := length-1, r.Int63(), letterIdMax; i >= 0; { if remain == 0 { cache, remain = r.Int63(), letterIdMax } if idx := int(cache & letterIdMask); idx < len(letters) { b[i] = letters[idx] i-- } cache >>= letterIdBits remain-- } return *(*string)(unsafe.Pointer(&b)) } // RandString generate random string of specified length. func RandString(length int) string { return Random(Letters, length) } // RandStrUpper generate a random upper case string. func RandStrUpper(length int) string { return Random(UpperLetters, length) } // RandStrLower generate a random lower case string. func RandStrLower(length int) string { return Random(LowerLetters, length) } // RandNumeralStr generate a random numeral string of specified length. func RandNumeralStr(length int) string { return Random(Numeral, length) } // RandNumeralOrLetter generate a random numeral or letter string. func RandNumeralOrLetter(length int) string { return Random(Numeral+Letters, length) }