package main
import (
"flag"
"fmt"
"math/rand"
"strings"
"time"
)
const (
NUM string = "0123456789"
CHAR string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
SPEC string = "~!@#$%^&*?()<>,.;:"
)
var (
length int
typeset string
)
func parseArgs() {
flag.IntVar(&length, "l", 16, "指定密码长度")
flag.StringVar(&typeset, "t", "char",
`指定密码字符集
num: 数字集
char: 字母集
mix: 数字和字母集
advance: 数字和字母和特殊字符集`)
flag.Parse()
}
func strJion(stragrs ...string) string {
var str strings.Builder
for _, v := range stragrs {
str.WriteString(v)
}
newStr := str.String()
return newStr
}
func generatePwd() string {
var pwd []byte = make([]byte, length, length)
var sourceSet string
switch typeset {
case "num":
sourceSet = strJion(NUM)
case "char":
sourceSet = strJion(CHAR)
case "mix":
sourceSet = strJion(NUM, CHAR)
case "advance":
sourceSet = strJion(NUM, CHAR, SPEC)
default:
sourceSet = CHAR
}
//fmt.Printf("%v\n", sourceSet)
for i := 0; i < length; i++ {
pwd[i] = sourceSet[rand.Intn(len(sourceSet))]
}
return string(pwd)
}
func main() {
rand.Seed(time.Now().UnixNano())
parseArgs()
//fmt.Printf("%d, %s\n", length, typeset)
p := generatePwd()
fmt.Println(p)
}