Хеширующая программа не возвращает одинаковые значения для одного и того же файла - PullRequest
1 голос
/ 12 апреля 2019

Эта созданная мной функция хеширования (которая сканирует новые файлы и вычисляет их хэши), по-видимому, функционирует, однако, удалив файл, например test.c, а затем заменив его тем же файлом, он возвращает 2 разных хэш-значения Под этим я подразумеваю, что во время выполнения программы первый расчет может вернуть, например, хэш 1234, а после удаления и помещения того же файла в папку он затем возвращает 2345.

Кажется, что нет порядка, поскольку 1234 может быть результатом 5 раз подряд. Я задавался вопросом, есть ли поразительно очевидная причина в этом коде?

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <sys/inotify.h>
#include <openssl/sha.h>

int main (int argc, char *argv[])
{
        int fd;
        unsigned char c[SHA512_DIGEST_LENGTH];
        int i;
        SHA512_CTX mdContext;
        int bytes;
        unsigned char data[1024];
        const int event_size = sizeof(struct inotify_event);
        const int buf_len = 1024 * (event_size + FILENAME_MAX);
        char *directory = "/home/joe/Documents/";
        char *hashDirectory = "/home/joe/Documents/_Hash/";
        char hashInBuf[100];
        char hashOutBuf[100];
        fd = inotify_init();

        if (fd < 0) {
          perror("inotify_init");
        }
        while (1) {
          char buff[buf_len];
          int no_of_events, count = 0;

          //SEARCH FOR NEW FILES WITHIN DIRECTORY
          no_of_events = read (fd, buff, buf_len);
          while (count < no_of_events) {
            struct inotify_event *event = (struct inotify_event *)&buff[count];
            if (event->len) {
              if ((event->mask & IN_CREATE))
              if(!(event->mask & IN_ISDIR)) {
                printf("\n%s has been created\n", event->name);

                //CONJOIN DIRECTORY AND FILENAME / EXTENSION
                snprintf(hashInBuf, sizeof(hashInBuf), "%s/%s", directory, event->name);
                snprintf(hashOutBuf, sizeof(hashOutBuf), "%s/%s.txt", hashDirectory, event->name);

                FILE *ftest=fopen(hashInBuf, "rb");
                FILE *ftest2=fopen(hashOutBuf, "wt");

                //HASH FUNCTION
                SHA512_Init (&mdContext);
                while ((bytes = fread (data, 1, 1024, ftest)) != 0)
                SHA512_Update (&mdContext, data, bytes);
                SHA512_Final (c,&mdContext);
                for(i = 0; i < SHA512_DIGEST_LENGTH; i++){
                  fprintf(ftest2, "%02x", c[i]);
                  printf("%02x", c[i]);
                }
                fclose (ftest);
                fclose (ftest2);
                fflush (stdout);
              }
            }
            count += event_size + event->len;
          }
        }
        return 0;
}

Заранее спасибо!

1 Ответ

1 голос
/ 12 апреля 2019

В этой строке

if ((event->mask & IN_CREATE))

вы ожидаете события, когда файл создан .Затем ваша функция хеширования немедленно начинает работать!Это может привести к ситуации, когда файл не полностью записан, поэтому вы хэшировали только часть файла.

Вам следует использовать событие IN_CLOSE_WRITE чтобы убедиться, что файл уже полностью записан.

Другой вариант - не создавать файлы в этом каталоге, а создавать их во временном каталоге, а затем перемещая их в целевой каталог.Соответствующее событие IN_MOVED_TO затем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...