Почему в этом случае fork лучше, чем threads? С файлом в 139 мб (rockyou.txt) форк составляет 0,5 секунды, с тем же файлом и тем же словом в конце файла это 3 секунды с потоком (измеряется как часами(), так и обычным секундомером, потоки занимают намного больше времени чем форк)
Программа читает каждую строку списка слов, хеширует ее и сравнивает с дайджестом.
Это с форком
void wordlistFork(char digest[], char hashtype[], FILE *wordlist,int numberOfFork){
int i;
clock_t t;
fseek(wordlist, 0L, SEEK_END);
long fileLength = ftell(wordlist);
fseek(wordlist, 0L, SEEK_SET);
for(i=0;i<numberOfFork;i++){
int pid = fork();
if(pid==0){
char line[512];
long initialOffset = correctOffset(lengthOfFile*i/numberOfFork,wordlist);
long finalOffset = correctOffset(lengthOfFile*(i+1)/numberOfFork,wordlist);
fseek(wordlist, initialOffset, SEEK_SET);
t = clock();
while (initialOffset < finalOffset) {
fscanf(wordlist,"%s\n",line);
char tempLine[512] = {0};
strncpy(tempLine,line,strlen(line));
if (strcmp(hash(tempLine,hashType), digest) == 0) {
printf("Child %d: Trovato! hash %s %s -> %s\n",i, tipohash, digest, linea);
t = clock() -t;
double time_taken = ((double)t)/CLOCKS_PER_SEC;
printf("Time elapsed: %f seconds\n",time_taken);
system("killall hashcrack");
return;
}
initialOffset = ftell(wordlist);
}
printf("Child %d Found nothing.\n",i);
exit(0);
}
}
for(i=0;i<numberOfFork;i++)
wait(NULL);
}
это с нитками
for(i=0;i<numberOfThreads;i++)
pthread_create(&threads[i], NULL, (void *(*)(void *)) crack, (void *)(intptr_t) i);
for(i=0;i<numberOfThreads;i++)
pthread_join(threads[i],NULL);
void *crack(const int *args){
int threadID = (int)(intptr_t)args;
char line[512];
FILE *wordlist = fopen(Tpath,"r");
long initialOffset = correctOffset(fileLength*threadID/numberOfThreads,wordlist);
long finalOffset = correctOffset(fileLength*(threadID+1)/numberOfThreads,wordlist);
fseek(wordlist, initialOffset, SEEK_SET);
while (initialOffset < FinalOffset) {
fscanf(wordlist,"%s\n",line);
char tempLine[512] = {0};
strncpy(tempLine,line,strlen(line));
if (strcmp(hash(tempLine,hashType), Tdigest) == 0) {
printf("Thread %d: Found! hash %s %s -> %s\n",threadID, hashType, Tdigest, line);
system("killall hashcrack");
exit(0);
}
initialOffset = ftell(wordlist);
}
printf("Thread %d: found nothing.\n",threadID);
return NULL;
}