How to get hash of MD5 file in C ++?

I have a file path. How can I get the MD5 hash?

+60
c ++ hash md5
Aug 02 '09 at 22:35
source share
12 answers

Here, a direct implementation of the md5sum command md5sum performed, which calculates and displays the MD5 of the file specified on the command line. It must be linked to the OpenSSL library ( gcc md5.c -o md5 -lssl ) to work. This is pure C, but you should easily adapt it to your C ++ application.

 #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; } 
+40
Aug 02 '09 at 23:34
source share

You can implement the MD5 algorithm yourself (examples are available all over the Internet), or you can link them to OpenSSL libraries and use the OpenSSL digest functions. here is an example of getting an MD5 byte array:

 #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); } 
+20
Aug 02 '09 at 22:43
source share
 QFile file("bigimage.jpg"); if (file.open(QIODevice::ReadOnly)) { QByteArray fileData = file.readAll(); QByteArray hashData = QCryptographicHash::hash(fileData,QCryptographicHash::Md5); // or QCryptographicHash::Sha1 qDebug() << hashData.toHex(); // 0e0c2180dfd784dd84423b00af86e2fc } 
+9
Jun 14 2018-11-11T00:
source share

For those redirected from " https://stackoverflow.com/questions/4393017/md5-implementation-in-c , because it was incorrectly marked as duplicate.

The example given here works:

http://www.zedwood.com/article/cpp-md5-function

If you are compiling in VC ++ 2010, you will need to change its main.cpp to the following:

 #include <iostream> //for std::cout #include <string.h> //for std::string #include "MD5.h" using std::cout; using std::endl; int main(int argc, char *argv[]) { std::string Temp = md5("The quick brown fox jumps over the lazy dog"); cout << Temp.c_str() << endl; return 0; } 

You will have to change the MD5 class a bit if you read in the char * array instead of a string to answer the question on this page here.

EDIT:

Apparently the change to the MD5 library is unclear, so the Full VC ++ 2010 solution includes char * for your convenience:

https://github.com/alm4096/MD5-Hash-Example-VS

A little explanation here:

 #include <iostream> //for std::cout #include <string.h> //for std::string #include <fstream> #include "MD5.h" using std::cout; using std::endl; int main(int argc, char *argv[]) { //Start opening your file ifstream inBigArrayfile; inBigArrayfile.open ("Data.dat", std::ios::binary | std::ios::in); //Find length of file inBigArrayfile.seekg (0, std::ios::end); long Length = inBigArrayfile.tellg(); inBigArrayfile.seekg (0, std::ios::beg); //read in the data from your file char * InFileData = new char[Length]; inBigArrayfile.read(InFileData,Length); //Calculate MD5 hash std::string Temp = md5(InFileData,Length); cout << Temp.c_str() << endl; //Clean up delete [] InFileData; return 0; } 

I just added the following to the MD5 library:

MD5.cpp:

 MD5::MD5(char * Input, long length) { init(); update(Input, length); finalize(); } 

MD5.h:

 std::string md5(char * Input, long length); 
+7
Mar 05 '14 at 10:21
source share
+4
Jan 10 2018-12-01T00:
source share

I used Botan to perform this operation and others earlier. AraK pointed to Crypto ++. I think both libraries are absolutely correct. Now it is up to you :-).

+3
Aug 03 '09 at 8:10
source share

I needed to do this now and needed a cross-platform solution suitable for C ++ 11, boost and openssl. I made a D'Nabre decision as a starting point and dropped it until the following:

 #include <openssl/md5.h> #include <iomanip> #include <sstream> #include <boost/iostreams/device/mapped_file.hpp> const std::string md5_from_file(const std::string& path) { unsigned char result[MD5_DIGEST_LENGTH]; boost::iostreams::mapped_file_source src(path); MD5((unsigned char*)src.data(), src.size(), result); std::ostringstream sout; sout<<std::hex<<std::setfill('0'); for(auto c: result) sout<<std::setw(2)<<(int)c; return sout.str(); } 

A quick test executable demonstrates:

 #include <iostream> int main(int argc, char *argv[]) { if(argc != 2) { std::cerr<<"Must specify the file\n"; exit(-1); } std::cout<<md5_from_file(argv[1])<<" "<<argv[1]<<std::endl; return 0; } 

Some links: Linux: -lcrypto -lboost_iostreams Windows: -DBOOST_ALL_DYN_LINK libeay32.lib ssleay32.lib

+3
Mar 09 '15 at 13:46
source share

There is a beautiful library at http://256stuff.com/sources/md5/ with an example use. This is the easiest library for MD5.

+2
Sep 21 '09 at 7:55
source share
+2
Dec 07 2018-12-12T00: 00Z
source share

Using Crypto ++, you can do the following:

 #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; 

I need something very similar because I cannot read in files with several gigabytes just to calculate the hash. In theory, I could compare them with memory, but I have to support 32-bit platforms, which are still problematic for large files.

+1
Apr 12 2018-10-12T00:
source share

Improvement of imputation by @ D'Nabre for C ++. Remember to compile with -lcrypto at the end: gcc md5.c -o md5 -lcrypto .

 #include <iostream> #include <iomanip> #include <fstream> #include <string> #include <openssl/md5.h> using namespace std; unsigned char result[MD5_DIGEST_LENGTH]; // function to print MD5 correctly void printMD5(unsigned char* md, long size = MD5_DIGEST_LENGTH) { for (int i=0; i<size; i++) { cout<< hex << setw(2) << setfill('0') << (int) md[i]; } } int main(int argc, char *argv[]) { if(argc != 2) { cout << "Specify the file..." << endl; return 0; } ifstream::pos_type fileSize; char * memBlock; ifstream file (argv[1], ios::ate); //check if opened if (file.is_open() ) { cout<< "Using file\t"<< argv[1]<<endl; } else { cout<< "Unnable to open\t"<< argv[1]<<endl; return 0; } //get file size & copy file to memory //~ file.seekg(-1,ios::end); // exludes EOF fileSize = file.tellg(); cout << "File size \t"<< fileSize << endl; memBlock = new char[fileSize]; file.seekg(0,ios::beg); file.read(memBlock, fileSize); file.close(); //get md5 sum MD5((unsigned char*) memBlock, fileSize, result); //~ cout << "MD5_DIGEST_LENGTH = "<< MD5_DIGEST_LENGTH << endl; printMD5(result); cout<<endl; return 0; } 
+1
Nov 22 '14 at 22:47
source share

md5.h also have MD5_* functions, very useful for a large file

 #include <openssl/md5.h> #include <fstream> ....... std::ifstream file(filename, std::ifstream::binary); MD5_CTX md5Context; MD5_Init(&md5Context); char buf[1024 * 16]; while (file.good()) { file.read(buf, sizeof(buf)); MD5_Update(&md5Context, buf, file.gcount()); } unsigned char result[MD5_DIGEST_LENGTH]; MD5_Final(result, &md5Context); 

Very simple, right? Converting to a string is also very simple:

 #include <sstream> #include <iomanip> ....... std::stringstream md5string; md5string << std::hex << std::uppercase << std::setfill('0'); for (const auto &byte: result) md5string << std::setw(2) << (int)byte; return md5string.str(); 
0
Mar 22 '17 at 16:53 on
source share



All Articles