2016-05-21 75 views
0

我對C++(實際上是兩天)頗爲陌生,我想知道是否可以使用此代碼進行一些並行化。由於有數百萬次的迭代,我需要更快的速度。從我迄今爲止所瞭解的內容來看,它是不可能並行化的,因爲我使用的唯一for循環取決於之前的迭代,這不允許並行化。對?如果並行化不可行,那麼如何進行優化,否則就會變得更快。我感到非常驚訝,因爲這隻比我的原始python代碼快3倍。 (有人說C++是高達100至400倍的速度比蟒蛇)C++中的GPU加速遞歸函數

如果需要的VisualStudio 2015年項目文件,請告訴我..

如果你運行應用程序: 您需要輸入一個SHA1哈希然後告訴PROGRAMM基數詞多少個字了,所以例如單詞測試: 哈希:a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 長度:4

感謝諮詢

#include "stdafx.h" 
#include <stdio.h> 
#include <string> 
#include <iostream> 
#include <cstring> 
#include "..\crytoPP\sha.h" 
#include "..\crytoPP\filters.h" 
#include "..\crytoPP\hex.h" 
#include "..\crytoPP\channels.h" 

using namespace CryptoPP; 
using namespace std; 

int found = 0; 
int iteration = 0; 
int length; 
char source[] = "abcdefghijklmnopqrstuvwxyz"; 
string solution = " didn't match"; 
string base_hash; 

string CHECK(string hash, int argc, char** argv); 
void COMBINATIONS(string b, int length, int source_length, int argc, char** argv); 

int main(int argc, char** argv) 
{ 
    char *arr_ptr = &source[0]; 
    int source_length = strlen(arr_ptr); 
    cout << "Please enter hash:"; 
    cin >> base_hash; 
    cout << "Please enter length:"; 
    cin >> length; 
    transform(base_hash.begin(), base_hash.end(), base_hash.begin(), ::toupper); 
    COMBINATIONS("", ::length, source_length, argc - 1, argv + 1); 
    system("PAUSE"); 
    return 0; 
} 

string CHECK(string hash, int argc, char** argv) { 
    if (::found == 0) { 
     iteration++; 
     cout << iteration << endl; 
     if (argc == 2 && argv[1] != NULL) 
      hash = string(argv[1]); 
     string s1; 
     SHA1 sha1; SHA224 sha224; SHA256 sha256; SHA512 sha512; 
     HashFilter f1(sha1, new HexEncoder(new StringSink(s1))); 
     ChannelSwitch cs; 
     cs.AddDefaultRoute(f1); 
     StringSource ss(hash, true /*pumpAll*/, new Redirector(cs)); 
     cout << s1 << endl; 
     if (s1 == ::base_hash) { 
      ::found = 1; 
      cout << " =" << hash << endl; 
     } 
     return s1; 
    } 
} 

void COMBINATIONS(string b, int length, int source_length, int argc, char** argv) { 
    if (::found == 0) { 
     if (length == 0) { 
      CHECK(b, argc, argv); 
     } 
     else { 
      for (int i = 0; i < source_length; i++) { 
       COMBINATIONS(b + ::source[i], length -1, source_length, argc -1, argv + 1); 
      CHECK(b, argc - 1, argv + 1); 
      } 
     } 
    } 
} 
+0

您將需要並行散列函數,這是_tough_甚至不可能。你想要做一些哈希蠻力嗎? – ForceBru

+1

由於您對該語言不熟悉,因此請指出,使用全部大寫字母是不正確的形式,並且通常保留給宏。這只是一個約定,但幾乎所有的C++代碼都使用這個約定。 – johnbakers

+0

不,我沒有試圖破解任何嚴肅..這個想法來了,當與朋友寫作,他挑戰我要破解一個小散列,因爲我是一個完美主義者,我希望這個工作,即使是大字。 D ..非常感謝你的提示,非常感謝! – 3Descape

回答

0

您應該嘗試的第一件事是在每次迭代中刪除您的輸出,因爲這會顯着降低程序的性能。

現在你用一個空字符串b調用COMBINATIONS只有一次,但如果你在main創建一個線程大小1的每個開始串b你可以有例如每個解決問題的大小相同的26個線程。然而,最好的辦法是重寫COMBINATIONS函數以更好地適應並行性。

此外,您每次撥打電話CHECK時都會發生內存泄漏,現在可能看起來並不像問題那麼嚴重,但您尋找的單詞越長,程序所需的內存就越多。 C++要求你自己管理內存,所以你至少應該使用delete(確保它可以被重用)釋放你用new分配的所有內存。如果你嘗試重新使用你創建的那些對象,那麼更好,因爲內存分配也有點慢。

最後但並非最不重要請重新考慮遞增/遞減的目的argcargv。坦率地說,我不太瞭解你的意圖,看起來很邪惡。

+0

歡迎您(: –

+0

只是做了一些測試..只需在每次迭代中刪除輸出使其速度提高約23倍!!!謝謝soooooo !!! – 3Descape