随机码的生成

通常使用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个是之前生成的随机码

posted @ 2012-10-29 11:06  kingdizzy  阅读(329)  评论(0编辑  收藏  举报