2009-01-15 137 views
4

this question中提到了wcrypt2。文件MD5校驗和

我需要的僅僅是計算文件的MD5。如果我可以計算它,而不必保存它,因爲它是以流格式下載的文件,這將是完美的。

我想有最直接的方法來做到這一點。

謝謝!

+0

非常類似於此:http://stackoverflow.com/questions/1952929/md5- file-hashing-match-delphi-output-with-php-md5file-function – 2010-01-03 12:06:53

回答

10

這裏是印第安納波利斯10工作代碼:

function MD5File(const FileName: string): string; 
var 
    IdMD5: TIdHashMessageDigest5; 
    FS: TFileStream; 
begin 
IdMD5 := TIdHashMessageDigest5.Create; 
FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); 
try 
    Result := IdMD5.HashStreamAsHex(FS) 
finally 
    FS.Free; 
    IdMD5.Free; 
end; 
end; 

問候, OscaR1

-3

大多數編程語言都有庫可用於計算字符串或字節數組的MD5。在某些語言中,它們甚至是標準庫的一部分。我對Delphi並不熟悉,所以我不知道它是否適用於Delphi,但我想說它很可能就是這樣。爲Delphi搜索哈希和/或加密庫。

3

Indy帶有計算幾個哈希的函數,MD5就是其中之一。從至少Delphi 2006開始,Indy已經包含在Delphi的所有版本中,並且可以免費下載舊版本的版本。

1

正如你所提到的,the post you linked to談論wcrypt2,這是一個密碼程序庫,包括MD5。您鏈接到的帖子似乎也表明它可用於Delphi 7,因爲提交者包括標記爲「Delphi 7」的輸出。你已經標記了這個問題delphi7,所以我認爲這也是你正在使用的版本。那麼,什麼阻止你使用wcrypt2

該問題鏈接到的副本wcrypt2.pas,該文件中的版權日期似乎表明該設備在Delphi 7發佈時已經可用。檢查你的安裝;你可能已經擁有了它。如果沒有,那麼該單位也表示它是通過Project Jedi獲得的,所以你可以試着在那裏尋找單位。

您引用的問題的答案包括示例Delphi代碼和Delphi爲MD5提供的單元名稱。他們與德爾福2009年,所以你應該檢查他們是否也可用於您的版本。

1

在Delphi中查看MD5SUM的this implementation。它需要一個字符串輸入,但我想你可以很容易地使它與一個流。

1

MessageDigest_5也適用於此。

+0

這是在Delphi 7中可用嗎?我沒有這個版本,所以我給出了答案的不確定性。 – 2009-01-15 22:22:38

+0

@Rob:自2005年起,MessageDigest_5一直可用,但自Delphi 7以來,IdHashMessageDigest.pas已被包含:http://wiert.wordpress.com/2009/12/11/delphi-md5-the-messagedigest_5-unit- has-been-there-since-delphi-2007/ – 2010-01-03 12:10:09

5

基於@dummzeuch的answere我寫了這個功能:

function getMD5checksum(s: TStream): string; 
var 
    md5: TIdHashMessageDigest5; 
    hash : T4x4LongWordRecord; 
begin 
    md5 := TIdHashMessageDigest5.Create; 
    s.Seek(0,0); 
    hash := md5.HashValue(s); 
    result := IntToHex(Integer(hash[0]), 4) + 
      IntToHex(Integer(hash[1]), 4) + 
      IntToHex(Integer(hash[2]), 4) + 
      IntToHex(Integer(hash[3]), 4); 
end; 
+2

要將散列轉換爲hexstring,您還可以使用:TIdHashMessageDigest5.AsHex(hash); – 2009-01-16 21:07:50

2

什麼:

function GetFileMD5(const Stream: TStream): String; overload; 
var MD5: TIdHashMessageDigest5; 
begin 
    MD5 := TIdHashMessageDigest5.Create; 
    try 
     Result := MD5.HashStreamAsHex(Stream); 
    finally 
     MD5.Free; 
    end; 
end; 

function GetFileMD5(const Filename: String): String; overload; 
var FileStream: TFileStream; 
begin 
    FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); 
    try 
     Result := GetFileMD5(FileStream); 
    finally 
     FileStream.Free; 
    end; 
end; 
0

我在Delphi 7中使用Indy 10.1中的以下函數。5

uses IdHashMessageDigest, idHash, Classes; 

... 

function cc_MD5File(const p_fileName : string) : string; 
//returns MD5 has for a file 
var 
    v_idmd5 : TIdHashMessageDigest5; 
    v_fs : TFileStream; 
    v_hash : T4x4LongWordRecord; 
begin 
    v_idmd5 := TIdHashMessageDigest5.Create; 
    v_fs := TFileStream.Create(p_fileName, fmOpenRead OR fmShareDenyWrite) ; 
    try 
    v_hash := v_idmd5.HashValue(v_fs); 
    result := v_idmd5.AsHex(v_hash); 
    finally 
    v_fs.Free; 
    v_idmd5.Free; 
    end; 
end;