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桁です。だから、ほとんど役に立たないです。効率が低いです。次のステップが複数のスレッドで実現されることを望んでいます。もっと速くしてください。以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。