穷举密码序列(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/archive/2011/01/03/1904715.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值