c#生成随机码

最近做一个项目需要用到查询码,于是顺手写了一个随机码生成类:

public class RandomPW
    {

        /// <summary>
        /// 生成单个随机数字
        /// </summary>
        public int CreateNum()
        {
            Random random = new Random(();
            int num = random.Next(10);
            return num;
        }
        /// <summary>
        /// 生成单个大写随机字母
        /// </summary>
        public string CreateBigAbc()
        {
            //A-Z的 ASCII值为65-90
            Random random = new Random();
            int num = random.Next(65, 91);
            string abc = Convert.ToChar(num).ToString();
            return abc;
        }
        /// <summary>
        /// 生成单个小写随机字母
        /// </summary>
        public string CreateSmallAbc()
        {
            //a-z的 ASCII值为97-122
            Random random = new Random();
            int num = random.Next(97, 123);
            string abc = Convert.ToChar(num).ToString();
            return abc;
        }
        /// <summary>
        /// 生成随机数
        /// </summary>
        /// <returns></returns>
        public string GetRandomPW(int len)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < len; i++)
            {
                Random random = new Random();
                switch (random.Next(3))
                {
                    case 0:
                        sb.Append(CreateNum());
                        break;
                    case 1:
                        sb.Append(CreateSmallAbc());
                        break;
                    case 2:
                        sb.Append(CreateBigAbc());
                        break;
                }
            }
            var nowdata = DateTime.Now.ToString("yyyymmdd");
            var result = nowdata + sb.ToString();
            return result;
        }
    }

但是使用之后发现生成的随机码都是一样的类似于:201813137777777777、20180613XXXXXXXXXX这类的随机码,可以看出,后面的随机码完全一样,于是我查看了一下random类的定义,发现random有两个构造方法,一个带参一个不带参,

 //
        // 摘要:
        //     新实例初始化 System.Random 类,使用依赖于时间的默认种子值。
        public Random();
        //
        // 摘要:
        //     新实例初始化 System.Random 类,使用指定的种子值。
        //
        // 参数:
        //   Seed:
        //     用来计算伪随机数序列起始值的数字。 如果指定的是负数,则使用其绝对值。
        public Random(int Seed);

想了一下,会不会是这个种子我没有设置,导致随机数的起始值一直是一样的呢,于是我修改代码为:

public class RandomPW
    {

        /// <summary>
        /// 生成单个随机数字
        /// </summary>
        public int CreateNum(int i)
        {
            Random random = new Random((int)DateTime.Now.Ticks+i);
            int num = random.Next(10);
            return num;
        }
        /// <summary>
        /// 生成单个大写随机字母
        /// </summary>
        public string CreateBigAbc(int i)
        {
            //A-Z的 ASCII值为65-90
            Random random = new Random((int)DateTime.Now.Ticks+i);
            int num = random.Next(65, 91);
            string abc = Convert.ToChar(num).ToString();
            return abc;
        }
        /// <summary>
        /// 生成单个小写随机字母
        /// </summary>
        public string CreateSmallAbc(int i)
        {
            //a-z的 ASCII值为97-122
            Random random = new Random((int)DateTime.Now.Ticks+i);
            int num = random.Next(97, 123);
            string abc = Convert.ToChar(num).ToString();
            return abc;
        }
        /// <summary>
        /// 生成随机数
        /// </summary>
        /// <returns></returns>
        public string GetRandomPW(int len)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < len; i++)
            {
                Random random = new Random((int)DateTime.Now.Ticks+i);
                switch (random.Next(3))
                {
                    case 0:
                        sb.Append(CreateNum(i));
                        break;
                    case 1:
                        sb.Append(CreateSmallAbc(i));
                        break;
                    case 2:
                        sb.Append(CreateBigAbc(i));
                        break;
                }
            }
            var nowdata = DateTime.Now.ToString("yyyymmdd");
            var result = nowdata + sb.ToString();
            return result;
        }
    }

 

可以看到,在每次声明Random对象的时候,保证传进去的种子的值是改变的,可以保持生成的随机码不重复。

 

 

转载于:https://www.cnblogs.com/yuchenghao/p/8819600.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随机生成6位图片验证码. /// <summary> /// PicHandler1 的摘要说明 /// </summary> public class PicHandler1 : IHttpHandler, IRequiresSessionState { private string mCheckNo = string.Empty; protected ImgBuilder _ImgBuilder = new ImgBuilder(); protected VryImgGen _ImgBuilderNew = new VryImgGen(); private string _text = string.Empty; private string _font = "宋体"; private int _fontSize = 8; private int _padding = 2; public void ProcessRequest(HttpContext context) { mCheckNo = DisCheckNo(); context.Session["CheckCode"] = mCheckNo; this._ImgBuilder.FontSize = this._fontSize; this._ImgBuilder.Padding = this._padding; if (!string.IsNullOrEmpty(this._font)) { this._ImgBuilder.Fonts = new string[] { this._font }; } this._ImgBuilderNew.ChaosWight = 40; this._ImgBuilderNew.FontSize = 25; this._ImgBuilderNew.Padding = 3; System.Drawing.Bitmap image = this._ImgBuilderNew.CreateImage(mCheckNo); System.IO.MemoryStream ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); context.Response.ClearContent(); context.Response.ContentType = "image/Jpeg"; context.Response.BinaryWrite(ms.ToArray()); context.Session["CheckCode"] = mCheckNo.ToString(); //如果没有实现IRequiresSessionState,则这里会出错,也无法生成图片 context.Response.End(); } //验证码生成 protected string DisCheckNo() { string hash = HashCode.GetNext(); string CheckNo = string.Empty; Random rd = new Random(DateTime.Now.Millisecond); for (int i = 0; i < 6; i++) { CheckNo += hash.Substring(rd.Next(1, hash.Length - 1), 1); } CheckNo = CheckNo.Replace("0", rd.Next(1, 9).ToString()); CheckNo = CheckNo.Replace("o", rd.Next(1, 9).ToString());
可以使用C#内置的`Random`类来生成随机密码,然后使用密码强度校验器来确保密码强度。以下是一个示例代码: ```csharp using System; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Web.Security; public static class PasswordGenerator { private static readonly Random Random = new Random(); public static string GeneratePassword(int length = 12) { const string validChars = "ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*?_-"; var password = new char[length]; for (var i = 0; i < length; i++) { var index = Random.Next(validChars.Length); password[i] = validChars[index]; } var passwordString = new string(password); var passwordValidator = new PasswordStrengthChecker(); var validationResult = passwordValidator.CheckPasswordStrength(passwordString); if (validationResult > MembershipPasswordStrength.Strong) { return passwordString; } return GeneratePassword(length); } } public class PasswordStrengthChecker { public MembershipPasswordStrength CheckPasswordStrength(string password) { var score = 0; var hasDigit = false; var hasLowerCase = false; var hasUpperCase = false; var hasNonAlphanumeric = false; foreach (var c in password) { if (char.IsDigit(c)) { hasDigit = true; score += 1; } else if (char.IsLower(c)) { hasLowerCase = true; score += 1; } else if (char.IsUpper(c)) { hasUpperCase = true; score += 1; } else { hasNonAlphanumeric = true; score += 2; } } if (!hasDigit || !hasLowerCase || !hasUpperCase || !hasNonAlphanumeric) { score = Math.Max(1, score); } if (password.Length < 8) { score = Math.Max(1, score); } else if (password.Length < 11) { score += 1; } else { score += 2; } if (score <= 1) { return MembershipPasswordStrength.Weak; } if (score <= 3) { return MembershipPasswordStrength.Medium; } if (score <= 6) { return MembershipPasswordStrength.Strong; } return MembershipPasswordStrength.VeryStrong; } } ``` 这个代码使用`Random`类生成随机数,并使用自定义的`PasswordStrengthChecker`类校验密码强度。你可以按照自己的需要修改密码长度和密码强度校验规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值