random.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // Package random provides utilities for generating random strings and numbers.
  2. package random
  3. import (
  4. "crypto/rand"
  5. "math/big"
  6. )
  7. var (
  8. numSeq [10]rune
  9. lowerSeq [26]rune
  10. upperSeq [26]rune
  11. numLowerSeq [36]rune
  12. numUpperSeq [36]rune
  13. allSeq [62]rune
  14. )
  15. // init initializes the character sequences used for random string generation.
  16. // It sets up arrays for numbers, lowercase letters, uppercase letters, and combinations.
  17. func init() {
  18. for i := 0; i < 10; i++ {
  19. numSeq[i] = rune('0' + i)
  20. }
  21. for i := 0; i < 26; i++ {
  22. lowerSeq[i] = rune('a' + i)
  23. upperSeq[i] = rune('A' + i)
  24. }
  25. copy(numLowerSeq[:], numSeq[:])
  26. copy(numLowerSeq[len(numSeq):], lowerSeq[:])
  27. copy(numUpperSeq[:], numSeq[:])
  28. copy(numUpperSeq[len(numSeq):], upperSeq[:])
  29. copy(allSeq[:], numSeq[:])
  30. copy(allSeq[len(numSeq):], lowerSeq[:])
  31. copy(allSeq[len(numSeq)+len(lowerSeq):], upperSeq[:])
  32. }
  33. // Seq generates a random string of length n containing alphanumeric characters (numbers, lowercase and uppercase letters).
  34. func Seq(n int) string {
  35. runes := make([]rune, n)
  36. for i := 0; i < n; i++ {
  37. idx, err := rand.Int(rand.Reader, big.NewInt(int64(len(allSeq))))
  38. if err != nil {
  39. panic("crypto/rand failed: " + err.Error())
  40. }
  41. runes[i] = allSeq[idx.Int64()]
  42. }
  43. return string(runes)
  44. }
  45. // Num generates a random integer between 0 and n-1.
  46. func Num(n int) int {
  47. bn := big.NewInt(int64(n))
  48. r, err := rand.Int(rand.Reader, bn)
  49. if err != nil {
  50. panic("crypto/rand failed: " + err.Error())
  51. }
  52. return int(r.Int64())
  53. }