随机码的生成

通常使用DateTime的Tick作为Random函数的Seek,在本机测试没有问题,但是问题来了,在服务器上时,cpu运行很快,当连续的取随机数时,它们的Tick是一样的,因此产生的随机数也一样,代码如下:

 private static readonly string[] _allChar = new string[] { "0","1","2","3","4","5","6","7","8","9",
            "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","W","X","Y","Z"};

        /// <summary>
        /// 生成随机密码,由字符和数字组成
        /// </summary>
        /// <param name="length"></param>
        /// <returns></returns>
        public static string CreatePass(int length)
        {
            StringBuilder sbPass = new StringBuilder();
            Random seekRand = new Random(unchecked((int)DateTime.Now.Ticks));
            //生成起始序列值
            int beginSeek = (int)seekRand.Next(0, Int32.MaxValue - 10000 * length);
            int[] seeks = new int[length];
            for (int i = 0; i < length; i++)
            {
                beginSeek += 10000;
                seeks[i] = beginSeek;
            }

            //生成并抽取随机数字
            for (int i = 0; i < length; i++)
            {
                Random rand = new Random(seeks[i]);
                sbPass.Append(_allChar[rand.Next(35)]);
            }
            return sbPass.ToString();
        }

  如何解决产生的随机数一样呢?关键点在于Random的Seek,使用一个不重复的Seek即可,所以想到了Guid的HashCode:

  Random seekRand = new Random(Guid.NewGuid().GetHashCode());

  效果不错~!

前面5个是后来生成的随机码,后面5个是之前生成的随机码

转载于:https://www.cnblogs.com/Kingdizzy/archive/2012/10/29/2744401.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值