package rand import ( "bytes" "math/rand" ) func (rr *Rand) randomGetSomeChar(str string, l int) string { bytes := []byte(str) var result []byte //r := rand.New(rand.NewSource(time.Now().UnixNano())) for i := 0; i < l; i++ { //result = append(result, bytes[r.Intn(len(bytes))]) result = append(result, bytes[rand.Intn(len(bytes))]) } return string(result) } // 长度选填 默认32位 func (rr *Rand) GetPassword(length ...int) string { baseNum := "023456789" baseCharLow := "abcdefghijkmnpqrstuvwxyz" baseCharHigh := "ABCDEFGHJKLMNOPQRSTUVWXYZ" baseSignSpec := "_" str := "023456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ_" var stringBuilder bytes.Buffer lenPassword := 32 if len(length) > 0 { lenPassword = length[0] } if lenPassword < 5 { lenPassword = 5 } stringBuilder.WriteString(rr.randomGetSomeChar(baseSignSpec, 1)) stringBuilder.WriteString(rr.randomGetSomeChar(baseNum, 1)) stringBuilder.WriteString(rr.randomGetSomeChar(baseCharLow, 1)) stringBuilder.WriteString(rr.randomGetSomeChar(baseCharHigh, 1)) stringBuilder.WriteString(rr.randomGetSomeChar(str, lenPassword-4)) strResult := stringBuilder.String() arrResult := []byte(strResult) for i := 0; i < 4; i++ { num := rand.Intn(lenPassword - 1) arrResult[i], arrResult[num] = arrResult[num], arrResult[i] } return string(arrResult) }