2015-07-01 43 views
16

Ho un bell'esempio di file mappati in memoria che calcola l'hash MD5 di un file. Funziona bene senza problemi.Calcola MD5 di una stringa in C++

Vorrei cambiarlo per calcolare l'hash MD5 di una stringa.

Così l'esempio è:

(comprendono #include <openssl/md5.h> a eseguire questo codice, e anche aumentare roba se si desidera eseguire quello con il file)

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(long long c: result) 
{ 
    sout<<std::setw(2)<<(long long)c; 
} 
return sout.str(); 

Il cambiamento che ho fatto è:

std::string str("Hello"); 
unsigned char result[MD5_DIGEST_LENGTH]; 
MD5((unsigned char*)str.c_str(), str.size(), result); 

std::ostringstream sout; 
sout<<std::hex<<std::setfill('0'); 
for(long long c: result) 
{ 
    sout<<std::setw(2)<<(long long)c; 
} 
return sout.str(); 

Ma questo produce il risultato:

8b1a9953c4611296a827abf8c47804d7 

Mentre il comando $ md5sum <<< Hello dà il risultato:

09f7e02f1290be211da707a266f153b3 

Perché i risultati sono in accordo? Quale è sbagliato?

Grazie.


EDIT:

Così ho avuto la risposta giusta che è spuntata laggiù. Il modo corretto per chiamare md5sum dal terminale è:

$ printf '%s' "Hello" | md5sum 

Per evitare la nuova linea viene incluso.

+0

Esiste un ritorno a capo nel file? – Slava

+0

@Slava Non ci sono file. "Hello" è semplicemente una stringa. Potresti per favore chiarire cosa intendi? –

+0

8b1a9953c4611296a827abf8c47804d7 è corretto per la stringa Hello – deviantfan

risposta

15

Stai passando una nuova riga finale al programma md5sum, ma non al tuo codice.

Si può vedere che l'operatore bash <<< aggiunge una nuova riga:

$ od -ta <<<Hello 
0000000 H e l l o nl 
0000006 

Per evitare questo, utilizzare printf:

$ printf '%s' Hello | od -ta 
0000000 H e l l o 
0000005 
$ printf '%s' Hello | md5sum 
8b1a9953c4611296a827abf8c47804d7 - 

In alternativa, si potrebbe includere una nuova riga nel programma versione:

std::string str("Hello\n"); 
+0

Grazie! Hai ragione! –