2014-09-11 5 views
1

내가 계산할 수있는 해시의 수를 알아 내려고했습니다. SHA-512 (512 비트 출력의 SHA-2)를 사용하고 있습니다. 이 Hashfunction을 코딩하지는 않았지만, 테스트를 위해 불량한 루프를 수행했습니다. 나는 C++에 대해 아직 익숙하지 않기 때문에 다음과 같은 상황이 발생하는 이유를 알지 못합니다.for-lops는 C++에서 어떻게 작동합니까? 예 : 계산 해시

프로그램을 실행했을 때 계산 시간이 오래 걸렸습니다. 내가 처음으로 몇 초 동안 약 10000 개의 해시를 가지고 있었지만, 몇 시간 후에 1000 개의 해시를 계산하는 데 약 1 분이 걸렸습니다. 아무도 왜 나에게이 문제를 "해결할 수 있습니까?" 출력은 다음과 같습니다

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 % 
[...] 

,하지만 난 확실하지 않고 올바르게 수행하는 방법도 없습니다. 어리석은 질문이라면 용서해주세요.하지만 당분간 저를 괴롭혔습니다. 당신의 convert 스트림이 새로운 값을 매번 추가, 각 반복에 대해 지속적으로 성장처럼 어떤 도움 :) 사전에

덕분에

+1

이러한 모든 나누기는 프로그램에 건강하지 않습니다. 다시 초기화하면 fortschritt에 들어가기 위해 1000으로 이동하는 추가 카운터 j를 만드십시오. – Surt

답변

3

것 같습니다. 가장 쉬운 방법은 for 루프 안에 stringstream convert;이라는 선언을 이동하여 매번 새로운 루프를 작성하는 것입니다.

주 루프에서 많은 수의 반복 작업을 수행하는 것처럼 숫자를 문자열로 변환하는 것이 효율적이지 않기 때문에 더 많은 최적화가 가능합니다.

+0

고마워, 나는 그것을 시도 할 것이다. 번호를 변환하는 더 좋은 방법이 있습니까? 계산 속도가 매우 빨라졌습니다. – JRsz

+1

당신의 sha512 방법은 문자열을 취하고 당신이 그것을 바꾸고 싶지 않다고 가정합니다. 문자열의 '채우기'생성자를 사용하여 루프 외부의 문자열에 대한 메모리를 미리 할당하여 가장 큰 숫자에 대해 충분히 커야합니다. 그런 다음 일반 정수 'C'itoa() 함수와 같은 효율적인 메소드를 사용하여 문자열을 백업하는 문자 버퍼로 각 정수를 직접 변환하십시오. 스트림의 오버 헤드는 완전히 제거 될 수 있습니다. –