std::vector<uint8_t> hashFile( std::wstring const& filename ) { std::ifstream in(filename, std::ifstream::binary); std::vector<uint8_t> retarr(16); uint8_t buf[1024]; md5_state_t md5; memset(&md5, 0, sizeof(md5_state_t)); md5_init(&md5); while (in.read((char *)buf, 1024)) { md5_append(&md5, buf, in.gcount()); } md5_finish(&md5, &retarr[0]); return retarr; } std::wstring hashFileString( std::wstring const& filename ) { std::wstringstream wss; for (auto byte : hashFile(filename)) wss << std::hex << std::uppercase << std::setw(2) << std::setfill(L'0') << byte; return wss.str(); }


md5 코드: 

http://svn.python.org/projects/stackless/branches/release26-maint/Modules/md5.h

http://svn.python.org/projects/stackless/branches/release26-maint/Modules/md5.c


아무리 찾아도 안나와서 그냥 만들었음...


본론은 이게 아니고 hashFile 특정파일에서 1024를 4096으로 바꾸면 해쉬값이 달라지는데 왜 그런건지 아는사람?

1024, 저 소스코드는 각종 온라인 File md5사이트와 같은 결과를 산출함

근데 4096으로 바꾸면 안됨...


테스트결과

Windows 1511(10586.0)

notepad.exe

1024: 60336413E419C2EA5E215F1A32061E40

4096: E1CD47466F3568E803C74C8C7A23BA56


system32/calc.exe

1024: D41D8CD98F00B204E9800998ECF8427E

4096: D41D8CD98F00B204E9800998ECF8427E

??



글쓰다가 고쳤다


std::vector<uint8_t> hashFile( std::wstring const& filename ) { std::ifstream in(filename, std::ifstream::binary); std::vector<uint8_t> retarr(16); uint8_t buf[4096]; md5_state_t md5; memset(&md5, 0, sizeof(md5_state_t)); md5_init(&md5); while (in.read((char *)buf, 4096), in.gcount()) { md5_append(&md5, buf, in.gcount()); } md5_finish(&md5, &retarr[0]); return retarr; } std::wstring hashFileString( std::wstring const& filename ) { std::wstringstream wss; for (auto byte : hashFile(filename)) wss << std::hex << std::uppercase << std::setw(2) << std::setfill(L'0') << byte; return wss.str(); }

DC는 여러모로 많은 도움이 되는 것같다