要求:
1、总长8位;
2、至少一个大写字母;
3、至少一个小写字母;
4、至少一个数字(0~9);
5、至少一个特殊字符;
using System;
using System.Collections.Generic;
using System.Text;
/****************************************************
* Author:quietwalk
* Date:2011-12-02
* Fuction:Generate a random password that consists of mixed case (at least one upper case and at least one lower case),
* at least one special character( Symbol) ,
* and at least one numeric, and eight characters long.
* **************************************************/
namespace UsefulClass
{
public class PasswordGenerator
{
//
public string GeneratePassowrd()
{
long tick = DateTime.Now.Ticks;
Random rdm = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));
List<int> lsOrder = GetOrder();
int maxNumber = 5;
int iRemain = 4;
int iCurrentLength = 0;
int number = 0;
List<int> lsResult = new List<int>();
for (int i = 0; i < 4; i++)
{
int type = lsOrder[i];//order of U,L,S,N
maxNumber = 8 - iCurrentLength - iRemain + 1;// 此次最多能取的个数 = 总长-已经取的长度-取的次数
if (i == 3)//最后一次全取
{
number = maxNumber;
}
else
{
number = rdm.Next(1, maxNumber);//此次实际要取的个数
iCurrentLength += number;//目前串的实际长度
iRemain = 4 - (i + 1);//剩余可取数
}
List<int> lsTemp = new List<int>();
switch (type)
{
case 1://Uper Case
lsTemp = GetSomeNumber('U', number);
break;
case 2://Lower Case
lsTemp = GetSomeNumber('L', number);
break;
case 3://Special Character
lsTemp = GetSomeNumber('S', number);
break;
case 4://Numeric
lsTemp = GetSomeNumber('N', number);
break;
}
foreach (int value in lsTemp)
{
lsResult.Add(value);
}
}//for
#region Re-Order
long tick2 = DateTime.Now.Ticks;
Random random = new Random((int)(tick2 & 0xffffffffL) | (int)(tick2 >> 32));
// Random random = new Random();
int indexTemp = -1;
List<int> mixOrder = new List<int>();
for (int i = lsResult.Count - 1; i >= 0; i--)
{
if (i != 0)
{
indexTemp = random.Next(i + 1);
}
else
{
indexTemp = 0;
}
mixOrder.Add(lsResult[indexTemp]);
lsResult.RemoveAt(indexTemp);
}
#endregion Re-Order
string strResult = string.Empty;
foreach (int value in mixOrder)
{
strResult += Convert.ToChar(value);
}
return strResult;
}
private List<int> GetSomeNumber(char type, int number)
{
List<int> lsResult = new List<int>();
long tick = DateTime.Now.Ticks;
Random random = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));
if (type == 'U')//Upper case
{
#region Upper case
//List<int> lsUpperCase = new List<int>();
//for (int i = 65; i <= 90; i++)
//{
// lsUpperCase.Add(i);
//}
// Random random = new Random();
int iStart = 65;//A
int iEnd = 90;//Z
for (int j = 0; j < number; j++)
{
int iResult = random.Next(iStart, iEnd + 1);
lsResult.Add(iResult);
}
#endregion
}
else if (type == 'L')//Lower case
{
#region Lower case
//List<int> lsLowerCase = new List<int>();
//for (int i = 97; i <= 122; i++)
//{
// lsLowerCase.Add(i);
//}
int iStart = 97;//a
int iEnd = 122;//z
for (int j = 0; j < number; j++)
{
int iResult = random.Next(iStart, iEnd + 1);
lsResult.Add(iResult);
}
#endregion
}
else if (type == 'N')//Number
{
#region Number
//List<int> lsNumber = new List<int>();
//for (int i = 48; i <= 57; i++)
//{
// lsNumber.Add(i);
//}
int iStart = 48;//0
int iEnd = 57;//9
for (int j = 0; j < number; j++)
{
int iResult = random.Next(iStart, iEnd + 1);
lsResult.Add(iResult);
}
#endregion
}
else if (type == 'S')//Special characters
{
#region Sepcial Character
#region initialize the list
List<int> lsSpacialCahracters = new List<int>();
lsSpacialCahracters.Add(33);//!
lsSpacialCahracters.Add(34);//"
lsSpacialCahracters.Add(35);//#
lsSpacialCahracters.Add(36);//$
lsSpacialCahracters.Add(37);//%
lsSpacialCahracters.Add(38);//&
lsSpacialCahracters.Add(39);//,
lsSpacialCahracters.Add(40);//(
lsSpacialCahracters.Add(41);//)
lsSpacialCahracters.Add(42);//*
lsSpacialCahracters.Add(43);//+
lsSpacialCahracters.Add(44);//,
lsSpacialCahracters.Add(45);//-
lsSpacialCahracters.Add(46);//.
lsSpacialCahracters.Add(47);///
lsSpacialCahracters.Add(58);//:
lsSpacialCahracters.Add(59);//;
lsSpacialCahracters.Add(60);//<
lsSpacialCahracters.Add(61);//=
lsSpacialCahracters.Add(62);//>
lsSpacialCahracters.Add(63);//?
lsSpacialCahracters.Add(64);//@
lsSpacialCahracters.Add(91);//[
lsSpacialCahracters.Add(92);//\
lsSpacialCahracters.Add(93);//]
lsSpacialCahracters.Add(94);//^
lsSpacialCahracters.Add(95);//_
lsSpacialCahracters.Add(96);//、¡é
lsSpacialCahracters.Add(123);//{
lsSpacialCahracters.Add(124);//|
lsSpacialCahracters.Add(125);//}
lsSpacialCahracters.Add(126);//~
#endregion initialize the list
int iTotalCount = lsSpacialCahracters.Count - 1;
//Random rdm = new Random();
for (int i = 0; i < number; i++)
{
int index = random.Next(iTotalCount + 1);
lsResult.Add(lsSpacialCahracters[index]);
}
#endregion Sepcial Character
}
return lsResult;
}
private List<int> GetOrder()
{
List<int> intList = new List<int>();
intList.Add(1);//upper case
intList.Add(2);//lower case
intList.Add(3);//special character
intList.Add(4);//numeric
Random random = new Random();
int index = -1;
List<int> lsOrder = new List<int>();
for (int i = intList.Count - 1; i >= 0; i--)
{
if (i != 0)
{
index = random.Next(i + 1);
}
else
{
index = 0;
}
// strNumber += intList[index].ToString();
lsOrder.Add(intList[index]);
intList.RemoveAt(index);
}
return lsOrder;
}
}
}