2015-07-01 8 views
16

Ich habe ein schönes Beispiel für Memory-Mapped-Dateien, die den MD5-Hash einer Datei berechnet. Das funktioniert ohne Probleme.Berechnen MD5 einer Zeichenfolge in C++

Ich möchte es ändern, um den MD5-Hash einer Zeichenfolge zu berechnen.

So ist das Beispiel:

(enthalten #include <openssl/md5.h> diesen Code auszuführen, und auch Sachen zu steigern, wenn Sie das mit der Datei ausgeführt werden sollen)

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(); 

Die Veränderung, die ich gemacht ist:

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(); 

Aber dies führt zu dem Ergebnis:

8b1a9953c4611296a827abf8c47804d7 

Während der Befehl $ md5sum <<< Hello das Ergebnis gibt:

09f7e02f1290be211da707a266f153b3 

Warum die Ergebnisse nicht einverstanden sind? Welcher ist falsch?

Danke.


EDIT:

Also habe ich die richtige Antwort, die dort unten markiert ist. Der richtige Weg md5sum von Terminal zu nennen ist:

$ printf '%s' "Hello" | md5sum 

Um zu vermeiden, die neue Linie enthalten ist.

+0

Gibt es einen Wagenrücklauf in der Datei? – Slava

+0

@Slava Es gibt keine Datei. Das "Hallo" ist lediglich eine Zeichenfolge. Könnten Sie bitte klarstellen, was Sie meinen? –

+0

8b1a9953c4611296a827abf8c47804d7 ist richtig für die Zeichenfolge Hallo – deviantfan

Antwort

15

Sie übergeben eine letzte Zeilenumschaltung an das Programm md5sum, aber nicht an Ihren Code.

Sie können sehen, dass der bash <<< Operator eine neue Zeile ergänzt:

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

Um dies zu vermeiden, verwenden Sie printf:

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

Alternativ Sie eine neue Zeile in Ihrem Programm enthalten könnten Version:

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

Danke! Du hast recht! –