#arrays #c #string #hash #md5
#массивы #c #строка #хэш #md5
Вопрос:
У меня есть две функции, как я могу оптимизировать этот код? В функции списка слов я считываю из файла с помощью fscanf, я использую временный массив для создания хэша, поэтому я могу сохранить прочитанную строку, когда мне нужно ее распечатать, затем я сравниваю переданный дайджест с вычисленным дайджестом (чтобы взломать его). В функции md5 у меня есть массив «результат» с возвращаемым значением функции MD5, а затем я копирую массив в строку, потому что мне нужно преобразовать массив символов в шестнадцатеричную строку. Что-то не так? Функции работают, но могу ли я что-то исправить, чтобы сделать это быстрее или правильнее?
void wordlistMD5(char digest[], char hashtype[], FILE *wordlist) {
char line [512];
while (fscanf(wordlist,"%sn",line) != -1) {
char hash[512] = {0};
strncpy(hash,line,strlen(line));
if (strcmp(md5(hash), digest) == 0) {
printf("Found!nhash %s %s -> %sn", hashtype, digest, line);
return;
}
}
printf("Found nothing.n");
fclose(wordlist);
}
char *md5(char *string){
unsigned char result[MD5_DIGEST_LENGTH];
int i;
MD5((const unsigned char *)string, strlen(string), result);
for(i = 0; i < MD5_DIGEST_LENGTH; i )
sprintf(string 2*i,"x",result[i]);
return string;
}
Комментарии:
1. Просто пытаюсь понять смысл кода здесь. Есть ли у вас конкретная проблема, кроме «сделать быстрее»? Если бы вы сохранили хэши в виде двоичных значений, вы могли бы выполнять прямые сравнения намного быстрее, чем полагаться на медленные
strcmp
. В качестве альтернативы, вместо линейного сканирования, отсортируйте хэши по значению и используйте двоичный поиск.2. @tadman Я написал намерение кода прямо здесь, я переписываю его для ясности. Я хочу понять, есть ли в этом коде что-то неправильное, а затем, могу ли я сделать лучше (например, если выполнение sprinf происходит медленно, или если есть способ использовать один массив вместо двух с strncpy и что-то вроде этого). Хэши хранятся в текстовом формате, а не в двоичном, так что в любом случае спасибо
3. Вы всегда можете преобразовать их в двоичный файл. Это значительно ускорит сопоставление, поскольку вы можете обрабатывать хэш MD5 как два
uint64_t
значения, как вstruct md5hash { uint64_t a,b; }
soif (hash1.a==hash2.a amp;amp; hash1.b == hash2.b)
, и все готово, максимум два сравнения, плюс файл, который вам нужно прочитать, на 50% меньше.4. Кроме того, поскольку хэши всегда будут одинаковой длины, пропустите
fscanf
по крайней мере и просто читайте кусками правильной длины.