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