zoukankan      html  css  js  c++  java
  • 穷举密码序列(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 }

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

  • 相关阅读:
    Codeforces 448 D. Multiplication Table
    编程算法
    Linux内核导出符号宏定义EXPORT_SYMBOL源代码分析
    3.Chrome数据同步服务分析--server一片
    hadoop 开始时间datanode一个错误 Problem connecting to server
    about greenplum collection tool
    HDU 3172 Virtual Friends(并用正确的设置检查)
    leetcode
    Codeforces 450 C. Jzzhu and Chocolate
    Swift
  • 原文地址:https://www.cnblogs.com/heihaozi/p/1904715.html
Copyright © 2011-2022 走看看