穷举密码序列(C#)

     穷举密码序列一般使用的是递归。递归简化了程序,不用我管自己玩去吧,可是计算机的负担就重了,大量内存被用于记录返回点(虽然内存已经足够大了), 栈太深就崩溃了。尽量避开递归,用一个数组记录每一位密码对应的密码种子的位置,然后对该标识数组进行自加,类似于超大数的加法。代码如下:

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

使用该类的示例代码如下:

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 }

没有技术含量,纯属个人娱乐。

原文地址:https://www.cnblogs.com/heihaozi/p/1904715.html