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