1

我正在将 sha1 破解器作为一个大学项目来实施。我正在使用循环尝试不同的值来获取它们的哈希值。

for(int a=0; a<26; a++)
{
    for(int b=0; b<26; b++)
    {
        for(int c=0; c<26; c++)
        {
            for(int d=0; d<26; d++)
            {
                for(int e=0; e<26; e++)
                {

                    for(int f=0; f<26; f++)
                    {
                        result[0]=alphabet[a];
                        result[1]=alphabet[b];
                        result[2]=alphabet[c];
                        result[3]=alphabet[d];
                        result[4]=alphabet[e];
                        result[5]=alphabet[f];


                        //printf("result : %s\n candidate %x %x %x %x %x",result,candidate.a,candidate.b,candidate.c,candidate.d,candidate.e);

                        // Declarations
                        uint32_t a,b,c,d,e,temp;
                        uint32_t w[80]= {0};
                        a=h0;
                        b=h1;
                        c=h2;
                        d=h3;
                        e=h4;

下面的代码只是正在进行的 SHA-1 代码。外部的循环用于测试每个选项的 6 个字符的单词。

如果我现在尝试uint32_t在第一个 for 循环之前移动声明行(但仍在同一个函数中,C 编译器会警告我变量未使用并且程序崩溃,因为这些变量似乎在循环中丢失。但出于性能原因,我不想每次都声明它们是新的。如果我尝试全局声明它们,会发生同样的问题。但是当它们在最后一个循环中声明时,一切正常

4

2 回答 2

0

如果我现在尝试在第一个 for 循环之前移动 uint32_t 声明行(但仍在同一个函数中,C 编译器会警告我变量未使用并且程序崩溃,因为这些变量似乎在循环中丢失了。

如果你把 uint32_t a; uint32_t b; ... uint32_t e; 外面,然后重新声明为int a;诠释 b; ... 诠释; ,声明为 uint32_t 类型的变量超出范围。在最内部的 for 循环中,变量 a、b、...、e 是在 for 语句中声明的变量。毕竟 for 循环,int a, ..., e 超出范围,将使用 uint32_t 变量。但是它们没有分配给期望的值。

如果您将 uint32_t 声明放在内部 for 循环中,则 uint32_t 位于范围内,而那些 int 则超出范围(或者我应该说它们被“覆盖”?)。

但出于性能原因,我不想每次都声明它们是新的。

如果你真的想像现在这样保持嵌套循环,让编译器对其进行优化。每次执行内部循环时都不会重新声明变量。您可以比较结果汇编代码。否则,请考虑@JonathanLeffler 的建议,将它们分成函数以使您的代码更具可读性。

如果我犯了任何错误,请不要犹豫,指出它/他们!谢谢!

于 2016-11-26T02:03:34.407 回答
0

您要声明变量两次。每个都for(int x声明变量。您应该能够将uint32_t a,b,c ...循环移出循环并且在第一个forAND 之前您需要int从每个 for 语句中删除。

这应该编译(我不知道代码是否会工作或做你想做的事,因为你似乎正在重置最内层循环内的循环变量):

uint32_t a,b,c,d,e,temp;
uint32_t w[80]= {0};

for(a=0; a<26; a++)
{
    for(b=0; b<26; b++)
    {
        for(c=0; c<26; c++)
        {
            for(d=0; d<26; d++)
            {
                for(e=0; e<26; e++)
                {

                    for(f=0; f<26; f++)
                    {
                        result[0]=alphabet[a];
                        result[1]=alphabet[b];
                        result[2]=alphabet[c];
                        result[3]=alphabet[d];
                        result[4]=alphabet[e];
                        result[5]=alphabet[f];


                        //printf("result : %s\n candidate %x %x %x %x %x",result,candidate.a,candidate.b,candidate.c,candidate.d,candidate.e);

                        // Declarations
                        a=h0;
                        b=h1;
                        c=h2;
                        d=h3;
                        e=h4;

或者正如您在评论中所说,您需要重命名变量以不重新定义循环变量,如下所示:

for(int a=0; a<26; a++)
{
    for(int b=0; b<26; b++)
    {
        for(int c=0; c<26; c++)
        {
            for(int d=0; d<26; d++)
            {
                for(int e=0; e<26; e++)
                {

                    for(int f=0; f<26; f++)
                    {
                        result[0]=alphabet[a];
                        result[1]=alphabet[b];
                        result[2]=alphabet[c];
                        result[3]=alphabet[d];
                        result[4]=alphabet[e];
                        result[5]=alphabet[f];


                        //printf("result : %s\n candidate %x %x %x %x %x",result,candidate.a,candidate.b,candidate.c,candidate.d,candidate.e);

                        uint32_t A,B,C,D,E,temp; // var "a" is not "A"
                        uint32_t w[80]= {0};


                        // Declarations
                        A=h0;
                        B=h1;
                        C=h2;
                        D=h3;
                        E=h4;
于 2016-11-25T18:53:10.830 回答