2014-09-11 1 views
1

Я пытался выяснить, сколько хэшей я могу вычислить за это время. Я использую SHA-512 (SHA-2 с 512-битным выходом). Я не кодировал эту Hashfunction, но я сделал петлю для проверки, чтобы проверить ее. Я не очень владею C++, поэтому не знаю, почему возникла следующая ситуация.Как сделать for-lops точно работать на примере C++: вычисление хэшей

Когда я выполнил программу, вычисления заняли больше времени и дольше. В то время как у меня было около 10000 хешей с ним в первые несколько секунд, через несколько часов на компьютер ушло около минуты, чтобы вычислить 1000 хешей ... Может ли кто-нибудь сказать мне, почему и как «решить» это?

Это соответствующий код, я думаю:

int fortschritt = 0; 
int prozent = 0; 
string temp; 
stringstream convert; 
string loeschen; 

for (int i = 1; i <= 4294967295; i++) 
{ 
    convert << i; 
    temp = convert.str(); 

    loeschen = sha512(temp); 

    if (((int)(i/1000)) > fortschritt) 
    { 
     fortschritt = (int)(i/1000); 

     if (((int)(i*100)/4294967295) > prozent) 
     { 
      prozent = ((int)(i*100)/4294967295); 
     } 

     cout << fortschritt*1000 << " von 4294967295 - " << prozent << " %" << endl; 
    } 
} 

Результат выглядит следующим образом:

1000 von 4294967295 - 0 % 
2000 von 4294967295 - 0 % 
3000 von 4294967295 - 0 % 
4000 von 4294967295 - 0 % 
5000 von 4294967295 - 0 % 
6000 von 4294967295 - 0 % 
7000 von 4294967295 - 0 % 
8000 von 4294967295 - 0 % 
9000 von 4294967295 - 0 % 
10000 von 4294967295 - 0 % 
[...] 

Я думаю, что это что-то делать с тем, как я использую переменные, но я я не уверен, и у меня нет идеи, как это сделать правильно. Простите меня, если это глупый вопрос, но это беспокоило меня какое-то время.

Заранее спасибо за любую помощь :)

Джон

+1

Все эти деления не являются полезными для вашей программы, внесите дополнительный счетчик j, который переходит на 1000, чтобы ввести фортшетт, если вы его сбросите. – Surt

ответ

3

Похоже, ваш convert поток непрерывно растет на каждой итерации, добавляя новое значение каждый раз. Самое простое исправление - переместить объявление stringstream convert; внутри цикла for, чтобы каждый раз создавать новый.

Дальнейшие оптимизации, безусловно, возможны, так как неэффективно преобразовывать числа в строки так, как вы это делаете, для большого количества итераций в основном цикле.

+0

спасибо, я попробую. У вас есть лучший способ, как преобразовать число? Расчеты работают очень быстро, thats hilariouse! – JRsz

+1

Ваш метод sha512 принимает строку, и я предполагаю, что вы не хотите ее изменять. Я бы использовал конструктор «fill» для строки, чтобы предварительно выделить память для строки, которая была бы за пределами цикла достаточно большой для самого большого числа. Затем просто преобразуйте каждое целое число непосредственно в буфер символов, поддерживая строку, используя эффективный метод, такой как простая старая функция 'C' itoa(). Накладные расходы потока могут быть полностью удалены. –

Смежные вопросы