github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/randx/rand.go (about) 1 package randx 2 3 import ( 4 "bytes" 5 "crypto/rand" 6 "encoding/binary" 7 "log" 8 "math" 9 "math/big" 10 "time" 11 ) 12 13 // from https://github.com/thanhpk/randstr 14 15 // list of default letters that can be used to make a random string when calling String 16 // function with no letters provided 17 var defLetters = []rune("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") 18 19 // String generates a random string using only letters provided in the letters parameter 20 // if user ommit letters parameters, this function will use defLetters instead 21 func String(n int, letters ...string) string { 22 var letterRunes []rune 23 if len(letters) == 0 { 24 letterRunes = defLetters 25 } else { 26 letterRunes = []rune(letters[0]) 27 } 28 29 var bb bytes.Buffer 30 bb.Grow(n) 31 l := uint32(len(letterRunes)) 32 // on each loop, generate one random rune and append to output 33 for i := 0; i < n; i++ { 34 bb.WriteRune(letterRunes[binary.BigEndian.Uint32(Bytes(4))%l]) 35 } 36 return bb.String() 37 } 38 39 // Bytes generates n random bytes. 40 func Bytes(n int) []byte { 41 b := make([]byte, n) 42 _, err := rand.Read(b) 43 if err != nil { 44 panic(err) 45 } 46 return b 47 } 48 49 var rander = rand.Reader // random function 50 51 func Time() time.Time { 52 min := time.Date(1970, 1, 0, 0, 0, 0, 0, time.UTC) 53 max := time.Date(2070, 1, 0, 0, 0, 0, 0, time.UTC) 54 return TimeBetween(min, max) 55 } 56 57 func TimeBetween(min, max time.Time) time.Time { 58 minUnit, maxUnix := min.Unix(), max.Unix() 59 n, _ := rand.Int(rander, big.NewInt(maxUnix-minUnit)) 60 return time.Unix(n.Int64()+minUnit, 0) 61 } 62 63 func Bool() bool { return Int64Between(0, 1) == 0 } 64 65 func Int64() int64 { return Int64N(math.MaxInt64) } 66 67 func Int64N(n int64) int64 { 68 v, _ := rand.Int(rander, big.NewInt(n)) 69 return v.Int64() 70 } 71 72 func Int64Between(min, max int64) (v int64) { return Int64N(max-min+1) + min } 73 74 func IntN(n int) int { 75 v, _ := rand.Int(rander, big.NewInt(int64(n))) 76 return int(v.Int64()) 77 } 78 func Int() int { return int(Int32()) } 79 80 func IntBetween(min, max int) int { return IntN(max-min+1) + min } 81 82 func Int32N(n int) int32 { 83 v, _ := rand.Int(rander, big.NewInt(int64(n))) 84 return int32(v.Int64()) 85 } 86 87 func Int32() int32 { return Int32N(math.MaxInt32) } 88 89 func Uint64N(n int64) uint64 { 90 v, _ := rand.Int(rander, big.NewInt(n)) 91 return v.Uint64() 92 } 93 94 func Uint64() (v uint64) { 95 err := binary.Read(rander, binary.BigEndian, &v) 96 if err != nil { 97 log.Fatal(err) 98 } 99 return v 100 }