利用 Windows Crypt API 獲取 MD5/SHA1 值

昨天有人給了我一段據說是根據網上的 java 程序改編的計算 md5 值的 vfp 代碼,他說與他使用 md5 計算工具得到的 md5 值不同,想讓我看看是哪裏改編時出了問題。粗略看了一下,其實這段代碼十分眼熟,在 csdn 的 vfp 討論區中就曾出現過,只是我以前沒有需要,所以都是一眼而過,但對那段長長的 hash 變換表卻印象深刻。由於我也不知道具體的 md5 值算法,所以也只能先看那段 java 代碼,並未發現轉換中有何不妥之處。轉念一想,Windows Crypt API 中不是也有計算 hash 值的函數嗎?只是以前沒用過,不熟悉,打開 msdn 找到 Crypt API 這一篇仔細閱讀,再參考網上的一些資料,於是有了下面這段代碼。 

兼回答 tszsc 朋友的問題:
另一種常見的文件/字符串校驗方法是SHA1(也稱SHA160),它產生的是160/8=20個字節的驗證碼,比MD5的16個字節稍長一點,只需將上面的代碼稍作改造即可實現:
1. 加一個常量定義:#define CALG_SHA1    0x00008004
2. 將 lcHashValue = REPL... 這一句中的 16 改爲 20
3. 將調用 CryptCreateHash 函數的第二個參數改成 CALG_SHA1
函數名改爲 GetSHA1,如果你有空的話,將錯誤提示和註釋中的 MD5 字樣也改過來就更好了。

 

回答 cslx0810 朋友

這個問題提得有道理,我原來沒想將這個函數用來計算超大文件,只想偶爾用來校驗一些小數據量的值
下面是可以計算超大文件 md5 值的示例代碼,是在上面代碼的基礎上做了少量修改
我的電腦比較差,用這段代碼來計算一個700M的光盤ISO映像文件,用時一般在30秒左右
不過這可能除了跟 CPU/RAM 有關以外,跟文件是否有碎片以及硬盤速度也有很大關係
另外,代碼中 BYTES_PER_READ 常量的取值也會對整個計算速度產生較大的影響
我試驗的結果是一般要控制在256kb以內,再大就不僅不會快,反而更慢,大概就是俗話“貪多嚼不爛”的道理吧

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章