저는 C/C++에서 해시를 연구 중이며 Linux에서 md5sum 명령을 복제하려고했습니다. 소스 코드를 분석 한 결과, md5sum은 md5 라이브러리의 md5_stream에 의존하는 것으로 보입니다. md5_stream 함수를 md5.h 라이브러리의 근사치로 아래 코드에 입력하면 ~ 13-14 초 후에 실행됩니다. 나는 직접 md5_stream 함수를 호출하려고 노력했으며 ~ 13-14 초를 가졌다. md5sum은 4 초 후에 실행됩니다. 코드에서 속도를 내기 위해 GNU 사람들이 한 일은 무엇입니까?MD5Sum이 왜 그렇게 빠른 이유는 무엇입니까?
md5.h/md5.c 코드는 CoreUtils 소스 코드에서 사용할 수 있습니다.
#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
#include <iostream>
#include <iomanip>
#include <fstream>
#include "md5.h"
#define BLOCKSIZE 32784
int main()
{
FILE *fpinput, *fpoutput;
if ((fpinput = fopen("/dev/sdb", "rb")) == 0) {
throw std::runtime_error("input file doesn't exist");
}
struct md5_ctx ctx;
size_t sum;
char *buffer = (char*)malloc (BLOCKSIZE + 72);
unsigned char *resblock = (unsigned char*)malloc (16);
if (!buffer)
return 1;
md5_init_ctx (&ctx);
size_t n;
sum = 0;
while (!ferror(fpinput) && !feof(fpinput)) {
n = fread (buffer + sum, 1, BLOCKSIZE - sum, fpinput);
if (n == 0){
break;
}
sum += n;
if (sum == BLOCKSIZE) {
md5_process_block (buffer, BLOCKSIZE, &ctx);
sum = 0;
}
}
if (n == 0 && ferror (fpinput)) {
free (buffer);
return 1;
}
/* Process any remaining bytes. */
if (sum > 0){
md5_process_bytes (buffer, sum, &ctx);
}
/* Construct result in desired memory. */
md5_finish_ctx (&ctx, resblock);
free (buffer);
for (int x = 0; x < 16; ++x){
std::cout << std::setfill('0') << std::setw(2) << std::hex << static_cast<uint16_t>(resblock[x]);
std::cout << " ";
}
std::cout << std::endl;
free(resblock);
return 0;
}
EDIT : Fedora 19 64 비트에서 기본 mkspec 문제가 있었습니까?
코드를 빌드 할 때 디버그 모드로 구축하고 있습니까? 어떤 최적화 수준을 사용하고 있습니까? – Tim
gnuutils ... 소스를 사용할 수 있으며 직접 볼 수 있습니다. –
팀 : 현재 Qt를 구축 중입니다. 기본적으로 Qt 빌드 환경은 -O2 빌드 플래그를 추가합니다. 릴리스 모드에서 컴파일 및 테스트하므로 라이브러리 및 후크 디버깅이 방해되어서는 안됩니다. MarcB : md5sum 소스 코드를 보면 GNUUtils라는 것을 알 수 있습니다. 나는 그들이 어떻게 그들의 위치를 최적화했는지에 대한 통찰력을 찾고있다. – MagikWorx