Я могу придумать множество операционных вопросов, почему вы не захотите этого делать:
Тем не менее, есть решение, в котором вы получаете большую часть преимуществ запуска PHP со своим встроенным веб-сервером, получая большую выгоду от запуска веб-сервер спереди. То есть вы можете использовать такой сервер, как Nginx, как обратный прокси-сервер для встроенного веб-сервера PHP. В этой ситуации HTTP становится заменой FastCGI, аналогичной обычным обычаям встроенного HTTP-сервера в приложениях Node.js.
Теперь я не могу говорить о специфике предупреждения в поскольку я не являюсь одним из авторов PHP. Если бы это был я, я бы не запускал только PHP по причинам выше, но я мог бы рассмотреть возможность запуска его за реальным веб-сервером, таким как Nginx. Для меня, тем не менее, настройка PHP с помощью PHP-FPM и то, что не так сложно, и я возьму это на догадки о мореходности встроенного сервера, который документально подтвержден только для тестирования.
Вот прямая реализация команды 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;
}
Вы можете реализовать алгоритм 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);
}
У меня есть раньше использовал Botan для выполнения этой и других операций. AraK указал на Crypto ++. Думаю, обе библиотеки вполне годны. Теперь дело за вами: -).
На http://256stuff.com/sources/md5/ есть красивая библиотека с примерами использования. Это простейшая библиотека для MD5.
Используя 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-битные платформы - это все еще проблематично для больших файлов.