package utils

import (
	tRand "crypto/rand"
	"math/big"
	"math/rand"
	"time"
)

var defaultLetters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")

// GetPseudoRandomCode 伪随机数(性能高)
func GetPseudoRandomCode(n int, allowedChars ...[]rune) string {
	//rand.Seed(time.Now().UnixNano())
	rand.New(rand.NewSource(time.Now().UnixNano()))

	var letters []rune

	if len(allowedChars) == 0 {
		letters = defaultLetters
	} else {
		letters = allowedChars[0]
	}

	b := make([]rune, n)
	for i := range b {
		b[i] = letters[rand.Intn(len(letters))]
	}

	return string(b)
}

// GetTrueRandomCode 真随机数 (在linux上已经有一个实现就是/dev/urandom,crypto/rand 就是从这个地方读“真随机”数字返回,但性能比较慢)
func GetTrueRandomCode(n int, allowedChars ...[]rune) string {
	var letters []rune
	if len(allowedChars) == 0 {
		letters = defaultLetters
	} else {
		letters = allowedChars[0]
	}

	b := make([]rune, n)
	for i := range b {
		n, _ := tRand.Int(tRand.Reader, big.NewInt(int64(len(letters))))
		b[i] = letters[n.Int64()]
	}

	return string(b)
}