C++フルパスワードで生成された実現コード


ここでいう「フルパスワード」とは、文字列にある可能性のあるすべてのパスワードを指定します。文字列「012345789」を例にとると、2ビットのパスワードは100個、つまりL^N個となります。Lは文字列の長さを表し、Nはパスワードを生成する桁数を表します)。
第一の方法:再帰。これは分かりやすいです。文字を分解するごとに、新しい文字列を作って、前の列に立てればいいです。コードは以下の通りです

void CpasswordCreateDlg::CreatePass1(CString inStr,int m,CString outStr)
{
  if (m==0)
  {
    fp.SeekToEnd();
    CString tStr=outStr+L"
"; fp.WriteString(tStr);//fp CStdioFile, passFlag++;// , , ULONGLONG int persent=int((float)passFlag/passScore*100);//passScore if (persent%5==0) { m_progressCtrl.SetPos(persent);//m_progressCtrl } } else { for (int i=0;i<inStr.GetLength();i++) { CreatePass1(inStr,m-1,outStr+inStr.Mid(i,1)); } } }
第二の方法:再帰的な方法は使用しない。コードは以下の通りです。コードの意味を説明してもらえば、当時なぜこのように設計されたのか思い出せません。自分が当時なぜこんなに牛Bだったのか理解できませんでした。次のコードが考えられます。

void CpasswordCreateDlg::CreatePass2(CString inStr,int m)
{
  fp.SeekToEnd();
  int *flag=new int [m];//                    
  for (int i=0;i<m;i++)
  {
    flag[i]=0;
  }
  int inStrLen=inStr.GetLength();
  ULONGLONG passCount=(ULONGLONG)pow((double)inStrLen,m);
  for (ULONGLONG i=0;i<passCount;i++)
  {
    for (int t=1;t<m;t++)
    {
      if (flag[m-t]>0&&flag[m-t]%inStrLen==0)//        ,                 。
      {
        flag[m-t-1]++;
        flag[m-t]=0;
      }
    }
    CString str=L"";
    for (int j=0;j<m;j++)
    {
      str+=inStr.GetAt(flag[j]);
    }
    flag[m-1]++;
    str+=L"
"; fp.WriteString(str); passFlag++; int persent=int((float)passFlag/passScore*100); if (persent%5==0) { m_progressCtrl.SetPos(persent); } } delete [] flag; }
生成のスピードはそんなに速くないです。一秒に二万個ぐらいでしょう。実際にはほとんど役に立ちません。例えば、この速度で5桁のフルパスワードを生成するには、パスワードの個数は916132832で、12時間ぐらいかかります。6桁なら、7桁です。だから、ほとんど役に立たないです。効率が低いです。次のステップが複数のスレッドで実現されることを望んでいます。もっと速くしてください。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。