I am trying to solve the problem in C for finding string of MD5 hash. To do that i want to distribute calculation to different nodes (2 pcs) by splitting program code. How to run MPI and attach salve nodes through SSH server i already learned from this great tut Specify the machines running program using MPI
Is there eny possibilities to split half of the for loops to calculate on different node? Currently program works the same on both nodes and exits when master or slave node finds it first when i am running it as ~/$mpirun -n 2 -H master,slave1 myprogram
/*
C Example w/o mpi
mpicc md5.c -o md5 -lcrypto -lssl
gcc md5.c -o md5 -lcrypto -lssl
./md5
Single process on c2d laptop
String finding matchin md5 of string "hello" tooks
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <time.h>
#if defined(__APPLE__)
# define COMMON_DIGEST_FOR_OPENSSL
# include <CommonCrypto/CommonDigest.h>
# define SHA1 CC_SHA1
#else
# include <openssl/md5.h>
#endif
char *str2md5(const char *str, int length) {
int n;
MD5_CTX c;
unsigned char digest[16];
char *out = (char*)malloc(33);
MD5_Init(&c);
while (length > 0) {
if (length > 512) {
MD5_Update(&c, str, 512);
} else {
MD5_Update(&c, str, length);
}
length -= 512;
str += 512;
}
MD5_Final(digest, &c);
for (n = 0; n < 16; ++n) {
snprintf(&(out[n*2]), 16*2, "%02x", (unsigned int)digest[n]);
}
return out;
}
int main (int argc, char* argv[])
{
#ifdef COUNT // Very bad name, not long enough, too general, etc..
static int const count = COUNT;
#else
static int const count = 6; // default value
#endif
clock_t begin, end;
double time_spent;
begin = clock();
int bflag = 0;
int sflag = 0;
int index;
int c;
char input[count];
char action[2]; // char + \n
char *inputResult = (char*)malloc(33);
char *tmpResult = (char*)malloc(33);
char inputGuess[6];
int i,j,k,l,m,n;
char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
printf("Please enter string to guess (max 6 char - latin letters and numbers): ");
scanf("%s", input);
inputResult = str2md5(input, strlen(input));
printf("Md5 to find = %s \n", inputResult);
printf("Continue? (Y/n) ");
scanf("%s", action);
if(action == "n\n"){
return 0;
}
/* for 1 char input */
for(i=0; i<sizeof(letters); i++){ //letters + numbers
char guess1[] = {letters[i], '\0'};
printf("%s\n", guess1);
if(strcmp(str2md5(guess1, strlen(guess1)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess1);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
}
/* for 2 char input */
for(i=0; i<sizeof(letters); i++){ //letters + numbers
char guess1[] = {letters[i], '\0'};
printf("%s\n", guess1);
if(strcmp(str2md5(guess1, strlen(guess1)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess1);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
int j;
for(j=0; j<sizeof(letters); j++){
char guess2[] = {letters[i], letters[j], '\0'};
printf("%s\n", guess2);
//tmpResult = str2md5(guess, strlen(guess));
if(strcmp(str2md5(guess2, strlen(guess2)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess2);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
}
}
/* for 3 char input */
for(i=0; i<sizeof(letters); i++){ //letters + numbers
char guess1[] = {letters[i], '\0'};
printf("%s\n", guess1);
if(strcmp(str2md5(guess1, strlen(guess1)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess1);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
for(j=0; j<sizeof(letters); j++){
char guess2[] = {letters[i], letters[j], '\0'};
printf("%s\n", guess2);
//tmpResult = str2md5(guess, strlen(guess));
if(strcmp(str2md5(guess2, strlen(guess2)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess2);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
for(k=0; k<sizeof(letters); k++){
char guess3[] = {letters[i], letters[j], letters[k], '\0'};
printf("%s\n", guess3);
if(strcmp(str2md5(guess3, strlen(guess3)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess3);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
}
}
}
/* for 4 char input */
for(i=0; i<sizeof(letters); i++){ //letters + numbers
char guess1[] = {letters[i], '\0'};
printf("%s\n", guess1);
if(strcmp(str2md5(guess1, strlen(guess1)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess1);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
for(j=0; j<sizeof(letters); j++){
char guess2[] = {letters[i], letters[j], '\0'};
printf("%s\n", guess2);
//tmpResult = str2md5(guess, strlen(guess));
if(strcmp(str2md5(guess2, strlen(guess2)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess2);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
for(k=0; k<sizeof(letters); k++){
char guess3[] = {letters[i], letters[j], letters[k], '\0'};
printf("%s\n", guess3);
if(strcmp(str2md5(guess3, strlen(guess3)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess3);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
for(m=0; m<sizeof(letters); m++){
char guess4[] = {letters[i], letters[j], letters[k], letters[m], '\0'};
printf("%s\n", guess4);
if(strcmp(str2md5(guess4, strlen(guess4)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess4);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
}
}
}
}
/* for 5 char input */
for(i=0; i<sizeof(letters); i++){ //letters + numbers
char guess1[] = {letters[i], '\0'};
printf("%s\n", guess1);
if(strcmp(str2md5(guess1, strlen(guess1)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess1);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
for(j=0; j<sizeof(letters); j++){
char guess2[] = {letters[i], letters[j], '\0'};
printf("%s\n", guess2);
//tmpResult = str2md5(guess, strlen(guess));
if(strcmp(str2md5(guess2, strlen(guess2)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess2);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
for(k=0; k<sizeof(letters); k++){
char guess3[] = {letters[i], letters[j], letters[k], '\0'};
printf("%s\n", guess3);
if(strcmp(str2md5(guess3, strlen(guess3)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess3);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
for(m=0; m<sizeof(letters); m++){
char guess4[] = {letters[i], letters[j], letters[k], letters[m], '\0'};
printf("%s\n", guess4);
if(strcmp(str2md5(guess4, strlen(guess4)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess4);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
for(n=0; n<sizeof(letters); n++){
char guess5[] = {letters[i], letters[j], letters[k], letters[m], letters[n], '\0'};
printf("%s\n", guess5);
if(strcmp(str2md5(guess5, strlen(guess5)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess5);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
}
}
}
}
}
/* for 6 char input */
for(i=0; i<sizeof(letters); i++){ //letters + numbers
char guess1[] = {letters[i], '\0'};
printf("%s\n", guess1);
if(strcmp(str2md5(guess1, strlen(guess1)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess1);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
for(j=0; j<sizeof(letters); j++){
char guess2[] = {letters[i], letters[j], '\0'};
printf("%s\n", guess2);
//tmpResult = str2md5(guess, strlen(guess));
if(strcmp(str2md5(guess2, strlen(guess2)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess2);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
for(k=0; k<sizeof(letters); k++){
char guess3[] = {letters[i], letters[j], letters[k], '\0'};
printf("%s\n", guess3);
if(strcmp(str2md5(guess3, strlen(guess3)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess3);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
for(m=0; m<sizeof(letters); m++){
char guess4[] = {letters[i], letters[j], letters[k], letters[m], '\0'};
printf("%s\n", guess4);
if(strcmp(str2md5(guess4, strlen(guess4)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess4);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
for(n=0; n<sizeof(letters); n++){
char guess5[] = {letters[i], letters[j], letters[k], letters[m], letters[n], '\0'};
printf("%s\n", guess5);
if(strcmp(str2md5(guess5, strlen(guess5)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess5);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
for(l=0; l<sizeof(letters); l++){
char guess6[] = {letters[i], letters[j], letters[k], letters[m], letters[n], letters[l], '\0'};
printf("%s\n", guess6);
if(strcmp(str2md5(guess6, strlen(guess6)),inputResult) == 0){
printf("We guessed it! Your input was - %s \n", guess6);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f seconds\n", time_spent);
free(inputResult);
return 0;
}
}
}
}
}
}
}
return 0;
}