2014-09-11 46 views
1

我試圖找出在哪個時間內可以計算多少個哈希值。我正在使用SHA-512(512位輸出的SHA-2)。我沒有編寫這個Hashfunction,但我做了一個foor循環來測試它。我並不是很熟悉C++,所以我不知道爲什麼會出現以下情況。C++示例中的for-lops如何精確工作:計算哈希值

當我執行程序時,計算花費的時間越來越長。雖然我在幾秒鐘之內擁有大約10000個Hashes,但幾個小時後,我花了一分鐘的時間計算了1000個Hashes ...有人能告訴我爲什麼以及如何「解決」這個問題嗎?

這是相關的代碼,我想:

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以進入fortschritt。 – Surt 2014-09-11 10:58:57

回答

3

它看起來像你的convert流爲每次迭代持續增長,每次添加新值。最簡單的解決方法是將for循環中的stringstream convert;聲明移到每次都創建一個新聲明。

進一步的優化當然是可能的,因爲將數字轉換爲字符串的方式效率並不高,因爲您需要在主循環中進行大量迭代。

+0

謝謝,我會試試看。你有更好的方法,如何轉換數字? 現在的計算工作速度非常快,這是希拉里斯! – JRsz 2014-09-11 10:32:20

+1

你的sha512方法需要一個字符串,我假設你不想改變它。我會使用字符串的'fill'構造函數爲循環外部的字符串預先分配內存,以便爲最大數量提供足夠的空間。然後將每個整數直接轉換爲支持字符串的字符緩衝區,方法是使用一種有效的方法,例如普通的'C'itoa()函數。流的開銷可以完全刪除。 – 2014-09-11 10:44:40