Эффективный способ чтения из списка слов и хэша?

#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; } so if (hash1.a==hash2.a amp;amp; hash1.b == hash2.b) , и все готово, максимум два сравнения, плюс файл, который вам нужно прочитать, на 50% меньше.

4. Кроме того, поскольку хэши всегда будут одинаковой длины, пропустите fscanf по крайней мере и просто читайте кусками правильной длины.