text: package random
  
  import (
  	"math/rand"
  	"strings"
  	"time"
  )
  
  type (
  	Random struct {
  	}
  )
  
  // Charsets
  const (
  	Uppercase    = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  	Lowercase    = "abcdefghijklmnopqrstuvwxyz"
  	Alphabetic   = Uppercase + Lowercase
  	Numeric      = "0123456789"
  	Alphanumeric = Alphabetic + Numeric
  	Symbols      = "`" + `~!@#$%^&*()-_+={}[]|\;:"<>,./?`
  	Hex          = Numeric + "abcdef"
  )
  
  var (
  	global = New()
  )
  
  func New() *Random {
  	rand.Seed(time.Now().UnixNano())
  	return new(Random)
  }
  
  func (r *Random) String(length uint8, charsets ...string) string {
  	charset := strings.Join(charsets, "")
  	if charset == "" {
  		charset = Alphanumeric
  	}
  	b := make([]byte, length)
  	for i := range b {
  		b[i] = charset[rand.Int63()%int64(len(charset))]
  	}
  	return string(b)
  }
  
  func String(length uint8, charsets ...string) string {
  	return global.String(length, charsets...)
  }
  