问题描述
在这种情况下,为什么分叉方式比线程方式更好?如果文件的大小为139 mb(rockyou.txt),则分叉为0.5秒,文件末尾带有相同文件和相同字词的情况下,线程需要3秒(用clock()和普通秒表来衡量,线程花费的时间更长)比叉子)
该程序读取单词表的每一行,对其进行哈希处理,然后与摘要进行比较。
这是用叉子
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,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,SEEK_SET);
while (initialOffset < FinalOffset) {
fscanf(wordlist,line);
char tempLine[512] = {0};
strncpy(tempLine,strlen(line));
if (strcmp(hash(tempLine,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;
}
解决方法
您的代码性能是不确定的,并且取决于完成工作的顺序。可能恰好发生在一种情况下,首先测试文件的末尾,而在另一种情况下,首先测试文件的末尾。您的代码没有执行任何特定的顺序,因此在很大程度上取决于调度顺序的怪癖。
这就像您测试使用两种不同算法搜索相同的花园来寻找隐藏的蛋一样。如果每次都将鸡蛋放在同一位置,即使不是更好的算法,只要碰巧搜索鸡蛋在其搜索模式中较早的位置的算法也总是会获胜。