穷举密码序列一般使用的是递归。递归简化了程序,不用我管自己玩去吧,可是计算机的负担就重了,大量内存被用于记录返回点(虽然内存已经足够大了), 栈太深就崩溃了。尽量避开递归,用一个数组记录每一位密码对应的密码种子的位置,然后对该标识数组进行自加,类似于超大数的加法。代码如下:
1
public
class
PasswordDictionary
2 {
3 /// <summary>
4 /// 密码种子数组
5 /// </summary>
6 protected char [] PwdCharArray;
7 /// <summary>
8 /// 密码种子位置标识
9 /// </summary>
10 protected int [] PwdFlag;
11 /// <summary>
12 /// 是否结束标识
13 /// </summary>
14 protected bool IsEnd;
15 /// <summary>
16 /// 构造函数。密码种子为0123456789,密码长度为6
17 /// </summary>
18 public PasswordDictionary()
19 {
20 PwdCharArray = " 0123456789 " .ToCharArray();
21 PwdFlag = new int [ 6 ];
22 IsEnd = false ;
23 }
24 /// <summary>
25 /// 构造函数。
26 /// </summary>
27 /// <param name="PwdSeed"> 密码种子 </param>
28 /// <param name="PwdLen"> 密码长度 </param>
29 public PasswordDictionary(String PwdSeed, int PwdLen)
30 {
31 PwdCharArray = PwdSeed.ToCharArray();
32 PwdFlag = new int [PwdLen];
33 IsEnd = false ;
34 }
35 /// <summary>
36 /// 密码种子位置标识自加
37 /// </summary>
38 protected void AddPwdFlag()
39 {
40 int Max = PwdCharArray.Length;
41 PwdFlag[ 0 ] ++ ;
42 for ( int i = 0 ; i < PwdFlag.Length; i ++ )
43 {
44 if (PwdFlag[i] >= Max)
45 {
46 PwdFlag[i] = 0 ;
47 if (i + 1 < PwdFlag.Length)
48 {
49 PwdFlag[i + 1 ] ++ ;
50 }
51 }
52 }
53 }
54 /// <summary>
55 /// 获得下一个密码
56 /// </summary>
57 /// <returns></returns>
58 public String GetNextPwd()
59 {
60 if (IsEnd)
61 {
62 return null ;
63 }
64 System.Text.StringBuilder sb = new System.Text.StringBuilder();
65 IsEnd = true ;
66 for ( int i = 0 ; i < PwdFlag.Length; i ++ )
67 {
68 if (PwdFlag[i] < PwdCharArray.Length - 1 )
69 {
70 IsEnd = false ;
71 }
72 else if (IsEnd)
73 {
74 IsEnd = true ;
75 }
76 sb.Append(PwdCharArray[PwdFlag[i]]);
77 }
78 AddPwdFlag();
79 return sb.ToString();
80 }
81 }
82
2 {
3 /// <summary>
4 /// 密码种子数组
5 /// </summary>
6 protected char [] PwdCharArray;
7 /// <summary>
8 /// 密码种子位置标识
9 /// </summary>
10 protected int [] PwdFlag;
11 /// <summary>
12 /// 是否结束标识
13 /// </summary>
14 protected bool IsEnd;
15 /// <summary>
16 /// 构造函数。密码种子为0123456789,密码长度为6
17 /// </summary>
18 public PasswordDictionary()
19 {
20 PwdCharArray = " 0123456789 " .ToCharArray();
21 PwdFlag = new int [ 6 ];
22 IsEnd = false ;
23 }
24 /// <summary>
25 /// 构造函数。
26 /// </summary>
27 /// <param name="PwdSeed"> 密码种子 </param>
28 /// <param name="PwdLen"> 密码长度 </param>
29 public PasswordDictionary(String PwdSeed, int PwdLen)
30 {
31 PwdCharArray = PwdSeed.ToCharArray();
32 PwdFlag = new int [PwdLen];
33 IsEnd = false ;
34 }
35 /// <summary>
36 /// 密码种子位置标识自加
37 /// </summary>
38 protected void AddPwdFlag()
39 {
40 int Max = PwdCharArray.Length;
41 PwdFlag[ 0 ] ++ ;
42 for ( int i = 0 ; i < PwdFlag.Length; i ++ )
43 {
44 if (PwdFlag[i] >= Max)
45 {
46 PwdFlag[i] = 0 ;
47 if (i + 1 < PwdFlag.Length)
48 {
49 PwdFlag[i + 1 ] ++ ;
50 }
51 }
52 }
53 }
54 /// <summary>
55 /// 获得下一个密码
56 /// </summary>
57 /// <returns></returns>
58 public String GetNextPwd()
59 {
60 if (IsEnd)
61 {
62 return null ;
63 }
64 System.Text.StringBuilder sb = new System.Text.StringBuilder();
65 IsEnd = true ;
66 for ( int i = 0 ; i < PwdFlag.Length; i ++ )
67 {
68 if (PwdFlag[i] < PwdCharArray.Length - 1 )
69 {
70 IsEnd = false ;
71 }
72 else if (IsEnd)
73 {
74 IsEnd = true ;
75 }
76 sb.Append(PwdCharArray[PwdFlag[i]]);
77 }
78 AddPwdFlag();
79 return sb.ToString();
80 }
81 }
82
使用该类的示例代码如下:
1
PasswordDictionary pd
=
new
PasswordDictionary(
"
123456
"
,
4
);
2 while ( true )
3 {
4 String pwd = pd.GetNextPwd();
5 if (pwd == null )
6 {
7 break ;
8 }
9 Response.Write(pwd + " <br> " );
10 }
2 while ( true )
3 {
4 String pwd = pd.GetNextPwd();
5 if (pwd == null )
6 {
7 break ;
8 }
9 Response.Write(pwd + " <br> " );
10 }
没有技术含量,纯属个人娱乐。