using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LifePayment.Domain.Shared; public static class GlobalRandom { // å—符集 private static readonly string LowerCase = "abcdefghijklmnopqrstuvwxyz"; private static readonly string UpperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static readonly string Digits = "0123456789"; private static readonly string Symbols = "~`!@#$%^&*\\|()_-+=\\ã€{}\\[\\]'\"<>?.,:;/"; /// <summary> /// èŽ·å–æŒ‡å®šä½æ•°çš„éšæœºæ•° /// </summary> /// <param name="length"></param> /// <returns></returns> public static string GetRandomNum(int length) { var ranInt = 0; var minAMax = GetMinAndMaxNumByLength(length); ranInt = Random.Shared.Next(minAMax.Min, minAMax.Max + 1); return ranInt.ToString().PadLeft(length, '0'); } /// <summary> /// èŽ·å–æŒ‡å®šä½æ•°çš„å进制数的最大值和最å°å€¼ /// </summary> /// <param name="length"></param> /// <param name="isOneMin"></param> /// <returns></returns> /// <exception cref="ArgumentException"></exception> public static (int Min, int Max) GetMinAndMaxNumByLength(int length, bool minIsOne = true) { if (length <= 0) throw new ArgumentException("length必须大于ç‰äºŽ0"); if (length == 0) return (0, 0); var min = minIsOne ? 1 : (int)Math.Pow(10, length - 1); var max = (int)Math.Pow(10, length) - 1; return (min, max); } /// <summary> /// æ ¹æ®æŒ‡å®šé•¿åº¦å’Œå—ç¬¦æ± èŽ·å–æŒ‡å®šé•¿åº¦çš„éšæœºå—符串 /// </summary> /// <param name="length"></param> /// <param name="charPool"></param> /// <returns></returns> public static string GetRandomStrFromCharPool(int length, char[] charPool) { string result = null; if (length > 0 && charPool.IsNotNullOrEmpty()) { Shuffle(charPool); for (int i = 0; i < length; i++) { result += charPool[Random.Shared.Next(0, charPool.Length)]; } } return result; } /// <summary> /// 获å–éšæœºå¯†ç /// </summary> /// <param name="length"></param> /// <param name="charPool"></param> /// <returns></returns> public static string GetRandomPassword(int minLenth = 6, int maxLenth = 6) { // 生æˆä¸€ä¸ªåˆæ³•çš„å—符串长度 int length = minLenth == maxLenth ? minLenth : Random.Shared.Next(minLenth, maxLenth + 1); // 6 到 16 çš„éšæœºé•¿åº¦ // 至少包å«ä¸€ä¸ªå—æ¯ã€æ•°å—å’Œç¬¦å· var sb = new StringBuilder(); sb.Append(LowerCase[Random.Shared.Next(LowerCase.Length)]); // åŠ ä¸€ä¸ªå°å†™å—æ¯ sb.Append(UpperCase[Random.Shared.Next(UpperCase.Length)]); // åŠ ä¸€ä¸ªå¤§å†™å—æ¯ sb.Append(Digits[Random.Shared.Next(Digits.Length)]); // åŠ ä¸€ä¸ªæ•°å— //sb.Append(Symbols[Random.Shared.Next(Symbols.Length)]); // åŠ ä¸€ä¸ªç¬¦å· // å¡«å……å…¶ä½™å—符 var allChars = LowerCase + UpperCase + Digits; for (int i = sb.Length; i < length; i++) { sb.Append(allChars[Random.Shared.Next(allChars.Length)]); } // 打乱å—符顺åºï¼Œä»¥ç¡®ä¿å—符ç§ç±»ä¸è¢«é›†ä¸åœ¨å‰é¢ return new string(sb.ToString().OrderBy(c => Random.Shared.Next()).ToArray()); } /// <summary> /// éšæœºæ´—牌 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="array"></param> public static void Shuffle<T>(T[] array) { Random rng = new Random(); int n = array.Length; for (int i = n - 1; i > 0; i--) { int j = rng.Next(i + 1); (array[i], array[j]) = (array[j], array[i]); // 交æ¢å…ƒç´ } } }