1. 程式人生 > >window/linux下獲取檔案MD5

window/linux下獲取檔案MD5

MD5訊息摘要演算法(英語: MD5 Message-Digest Algorithm), 主要用於確保資訊傳輸過程的一致性校驗。   首先介紹兩個工具: window: WinMD5Free Linux: md5sum 這兩個工具的作用是驗證自己寫的程式獲取MD5是否正確。   先上一段錯誤程式碼:
 1 string getFileMd5(const string& file)
 2 {
 3     MD5 md5;
 4     ifstream f(file.c_str(), ios_base::binrary);
 5     char buffer[64 * 1024];
 6     while (!f.eof())
 7     {
 8         f.read(buffer, sizeof(buffer));
 9         size_t length = strlen(buffer);
10         md5.update(buffer, length);
11 } 12 return md5.md5(); 13 }

 

邏輯上,看似沒有問題的一段程式碼。 實際驗證的情況: window下獲取的MD5與第三方獲取的值一致; linux下獲取的MD5與第三方獲取的值不一致。 也就是說計算MD5時的輸入不一致,導致的結果不一致。   問題分析: 上面的程式碼最有可能出問題的地方在用strlen獲取buffer的大小。strlen以‘\0’標誌確定函式讀取終止。從檔案中讀取的二進位制資料中間是可能存在‘\0’的情況,列印每次strlen返回的結果,可以驗證這個情況。   問題的原因已經找到,那麼如何解決這個問題呢? 如果你熟悉C++ IO操作,io庫已經考慮過這個問題。獲取每次讀取的大小,使用fstream.gcount()返回正確讀取大小。   正確的程式碼
 1
string getFileMd5(const string& file) 2 { 3 MD5 md5; 4 ifstream f(file.c_str(), ios_base::binrary); 5 char buffer[64 * 1024]; 6 while (!f.eof()) 7 { 8 f.read(buffer, sizeof(buffer)); 9 md5.update(buffer, f.gcount()); 10 } 11 return md5.md5(); 12
}

 

工作中遇到這樣的問題,經歷過多次嘗試才發現這個問題,在此處記錄下。