Как получить MD5 хеш файла в C ++? [закрыто]

Я могу придумать множество операционных вопросов, почему вы не захотите этого делать:

  • Регистрация
  • Переписывает
  • Дросселирование
  • g3]
  • Эффективность (не тестировалась, но я предполагаю, что Nginx намного быстрее, чем встроенный неоптимизированный сервер PHP)
  • Интеграция с чем-то еще, что у вас есть, которое расширяет Nginx, Apache и IIS (такие вещи, как New Relic)

Тем не менее, есть решение, в котором вы получаете большую часть преимуществ запуска PHP со своим встроенным веб-сервером, получая большую выгоду от запуска веб-сервер спереди. То есть вы можете использовать такой сервер, как Nginx, как обратный прокси-сервер для встроенного веб-сервера PHP. В этой ситуации HTTP становится заменой FastCGI, аналогичной обычным обычаям встроенного HTTP-сервера в приложениях Node.js.

Теперь я не могу говорить о специфике предупреждения в поскольку я не являюсь одним из авторов PHP. Если бы это был я, я бы не запускал только PHP по причинам выше, но я мог бы рассмотреть возможность запуска его за реальным веб-сервером, таким как Nginx. Для меня, тем не менее, настройка PHP с помощью PHP-FPM и то, что не так сложно, и я возьму это на догадки о мореходности встроенного сервера, который документально подтвержден только для тестирования.

71
задан Peter Mortensen 6 December 2014 в 20:19
поделиться

5 ответов

Вот прямая реализация команды md5sum , которая вычисляет и отображает MD5 файла, указанного в командной строке. Чтобы он работал, его необходимо связать с библиотекой OpenSSL ( gcc md5.c -o md5 -lssl ). Это чистый C, но вы сможете достаточно легко адаптировать его к своему приложению C ++.

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <openssl/md5.h>

unsigned char result[MD5_DIGEST_LENGTH];

// Print the MD5 sum as hex-digits.
void print_md5_sum(unsigned char* md) {
    int i;
    for(i=0; i <MD5_DIGEST_LENGTH; i++) {
            printf("%02x",md[i]);
    }
}

// Get the size of the file by its file descriptor
unsigned long get_size_by_fd(int fd) {
    struct stat statbuf;
    if(fstat(fd, &statbuf) < 0) exit(-1);
    return statbuf.st_size;
}

int main(int argc, char *argv[]) {
    int file_descript;
    unsigned long file_size;
    char* file_buffer;

    if(argc != 2) { 
            printf("Must specify the file\n");
            exit(-1);
    }
    printf("using file:\t%s\n", argv[1]);

    file_descript = open(argv[1], O_RDONLY);
    if(file_descript < 0) exit(-1);

    file_size = get_size_by_fd(file_descript);
    printf("file size:\t%lu\n", file_size);

    file_buffer = mmap(0, file_size, PROT_READ, MAP_SHARED, file_descript, 0);
    MD5((unsigned char*) file_buffer, file_size, result);
    munmap(file_buffer, file_size); 

    print_md5_sum(result);
    printf("  %s\n", argv[1]);

    return 0;
}
44
ответ дан 24 November 2019 в 13:05
поделиться

Вы можете реализовать алгоритм MD5 самостоятельно (примеры есть во всем Интернете), или вы можете связать его с библиотеками OpenSSL и использовать функции дайджеста OpenSSL. вот пример получения MD5 массива байтов:

#include <openssl/md5.h>
QByteArray AESWrapper::md5 ( const QByteArray& data) {
    unsigned char * tmp_hash;
    tmp_hash = MD5((const unsigned char*)data.constData(), data.length(), NULL);
    return QByteArray((const char*)tmp_hash, MD5_DIGEST_LENGTH);
}
21
ответ дан 24 November 2019 в 13:05
поделиться

У меня есть раньше использовал Botan для выполнения этой и других операций. AraK указал на Crypto ++. Думаю, обе библиотеки вполне годны. Теперь дело за вами: -).

3
ответ дан 24 November 2019 в 13:05
поделиться

На http://256stuff.com/sources/md5/ есть красивая библиотека с примерами использования. Это простейшая библиотека для MD5.

2
ответ дан 24 November 2019 в 13:05
поделиться

Используя Crypto ++, вы могли бы сделать следующее:

#include <sha.h>
#include <iostream> 

SHA256 sha; 
while ( !f.eof() ) { 
   char buff[4096];
   int numchars = f.read(...); 
   sha.Update(buff, numchars); 
}
char hash[size]; 
sha.Final(hash); 
cout << hash <<endl; 

Мне нужно что-то очень похожее, потому что я не могу читать многогигабайтные файлы просто для вычисления хеша. Теоретически я мог бы отобразить их в памяти, но я должен поддерживать 32-битные платформы - это все еще проблематично для больших файлов.

1
ответ дан 24 November 2019 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: