Working fine. Time to optimization
This commit is contained in:
40
DergunPiotr-WaskoDominik/projekt/Ttiming.h
Normal file
40
DergunPiotr-WaskoDominik/projekt/Ttiming.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
#if !defined(DEF_TTIMING)
|
||||||
|
#define DEF_TTIMING
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
class TTiming
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
struct timeval start;
|
||||||
|
struct timeval stop;
|
||||||
|
void getTime(timeval &tv);
|
||||||
|
|
||||||
|
public:
|
||||||
|
TTiming(void);
|
||||||
|
|
||||||
|
void Begin(void);
|
||||||
|
long End(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
inline TTiming::TTiming(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void TTiming::Begin(void)
|
||||||
|
{
|
||||||
|
getTime(start);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline long TTiming::End(void)
|
||||||
|
{
|
||||||
|
getTime(stop);
|
||||||
|
return ((stop.tv_sec-start.tv_sec) * 1000 + (stop.tv_usec-start.tv_usec)/1000.0) + 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void TTiming::getTime(timeval &tv)
|
||||||
|
{
|
||||||
|
gettimeofday(&tv,NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -7,12 +7,13 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "genSha1.h"
|
#include "genSha1.h"
|
||||||
|
#include "Ttiming.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
#define lexSize 64 //rozmiar słownika musi być potęgą liczby 2!!!!
|
#define lexSize 64 //rozmiar słownika musi być potęgą liczby 2!!!!
|
||||||
#define maxStrSize 10 //maskymalny rozmiar szukanego hasła, nie moze być wiekszy niz 10!!
|
#define maxStrSize 10 //maskymalny rozmiar szukanego hasła, nie moze być wiekszy niz 10!!
|
||||||
#define minStrSize 3 //minimalny rozmiar szukanego hasła od 1 do maxStrSize
|
#define minStrSize 2 //minimalny rozmiar szukanego hasła od 1 do maxStrSize
|
||||||
#define offset 6 //ile bitów potrzeba do zapisania liczby lexSize-1 np lexSize=4 to wtedy offset = 2;
|
#define offset 6 //ile bitów potrzeba do zapisania liczby lexSize-1 np lexSize=4 to wtedy offset = 2;
|
||||||
#define mask 0x3f //np dla maxKomb zapisanego na 64bitach to jest 58 zer i 6 (czyli offset) jedynek: 0000000 0000000 0000000 0000000 0000000 0000000 0000000 00111111
|
#define mask 0x3f //np dla maxKomb zapisanego na 64bitach to jest 58 zer i 6 (czyli offset) jedynek: 0000000 0000000 0000000 0000000 0000000 0000000 0000000 00111111
|
||||||
|
|
||||||
@@ -30,6 +31,8 @@ char lex[lexSize] = {'a','b','c','d','e','f','g','h',
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
|
|
||||||
|
|
||||||
@@ -41,9 +44,12 @@ int main(int argc, char** argv) {
|
|||||||
MPI_Init(NULL, NULL);
|
MPI_Init(NULL, NULL);
|
||||||
|
|
||||||
int size,rank,strSize;
|
int size,rank,strSize;
|
||||||
|
short success = 1,sumSuccess = 1;
|
||||||
|
TTiming czasomierzacz;
|
||||||
|
|
||||||
MPI_Comm_size(MPI_COMM_WORLD, &size);
|
MPI_Comm_size(MPI_COMM_WORLD, &size);
|
||||||
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
|
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
|
||||||
|
|
||||||
uint64_t i; //licznik, 64 bit-owy bo maxStrSize * offset = 10 * 6 = 60 bit; 4 bity w "zapasie" :-)
|
uint64_t i; //licznik, 64 bit-owy bo maxStrSize * offset = 10 * 6 = 60 bit; 4 bity w "zapasie" :-)
|
||||||
uint64_t maxKomb; //maxKomb to maksymalna ilosć kombinacji hasła = lexSize ^ strSize;
|
uint64_t maxKomb; //maxKomb to maksymalna ilosć kombinacji hasła = lexSize ^ strSize;
|
||||||
|
|
||||||
@@ -51,34 +57,42 @@ int main(int argc, char** argv) {
|
|||||||
result = new char[41];
|
result = new char[41];
|
||||||
str = new char[maxStrSize];
|
str = new char[maxStrSize];
|
||||||
|
|
||||||
|
if (!rank) czasomierzacz.Begin();
|
||||||
|
|
||||||
for(strSize = minStrSize;strSize<=maxStrSize;strSize++){ //petla generujaca jaka ma być długość hasła z którego bedzie generowany hash
|
for(strSize = minStrSize;strSize<=maxStrSize;strSize++){ //petla generujaca jaka ma być długość hasła z którego bedzie generowany hash
|
||||||
maxKomb = pow(lexSize,strSize);//tak wiem że potega ale w całym programie wykona się maksymalnie tyle razy: ilość porcesów *(maxStrSize - minStrSize)
|
maxKomb = pow(lexSize,strSize);//tak, wiem że potega ale w całym programie wykona się maksymalnie tyle razy: ilość porcesów *(maxStrSize - minStrSize)
|
||||||
i = rank;
|
i = rank;
|
||||||
|
|
||||||
while(i<maxKomb){//generowanie różnych haseł
|
while(i<maxKomb){//generowanie różnych haseł
|
||||||
for(int j=0;j<strSize;j++){
|
for(int j=0;j<strSize;j++){
|
||||||
str[j] = lex[(i >> (offset*j)) & mask];
|
str[j] = lex[(i >> (offset*j)) & mask];
|
||||||
}
|
}
|
||||||
|
|
||||||
sha1((unsigned char*)str,strSize,result); //obliczanie hash z wygenerowanego wcześniej hasła
|
sha1((unsigned char*)str,strSize,result); //obliczanie hash z wygenerowanego wcześniej hasła
|
||||||
if(memcmp(argv[1],result,41) == 0 ){ //prównuje hash obliczony z tym podanym jako argument programu
|
|
||||||
//znaleziono hasha!!!
|
if(memcmp(argv[1],result,41) == 0){ //znalazłem odpowiedz
|
||||||
cout<<"Znalazłem!!!"<<endl;
|
success = 0; //ustwaiem zmienna success na 0
|
||||||
|
cout<<endl<<" Złamałem hasha: ";
|
||||||
for(int l=0;l<strSize;l++) cout<<str[l];
|
for(int l=0;l<strSize;l++) cout<<str[l];
|
||||||
cout<<endl;
|
cout<<endl;
|
||||||
MPI_Abort(MPI_COMM_WORLD,-1); //kończe wszystkie watki; działa ale to mało elegancka metoda
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MPI_Allreduce(&success,&sumSuccess,1,MPI::SHORT,MPI::BAND,MPI_COMM_WORLD); //robię bitowe AND na zmiennej 'success'. wyjdzie 0 gdy 'success' z któregokolwiek procesu jest równy 0
|
||||||
|
if(!sumSuccess) goto stop; //sumSuccess = 0 wiec ten proces się kończy.
|
||||||
|
|
||||||
i+=size;
|
i+=size;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stop:
|
||||||
|
|
||||||
delete[] result; //gdy bedzie wywołane MPI_Abort to i tak to nie zdziała, no ale jest...
|
if (!rank){
|
||||||
|
long time = czasomierzacz.End();
|
||||||
|
cout<<" Czas = "<<time<<" ms"<<endl<<endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete[] result;
|
||||||
delete[] str;
|
delete[] str;
|
||||||
|
|
||||||
|
|
||||||
MPI_Finalize();
|
MPI_Finalize();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user