在this question中提到了wcrypt2。文件MD5校驗和
我需要的僅僅是計算文件的MD5。如果我可以計算它,而不必保存它,因爲它是以流格式下載的文件,這將是完美的。
我想有最直接的方法來做到這一點。
謝謝!
在this question中提到了wcrypt2。文件MD5校驗和
我需要的僅僅是計算文件的MD5。如果我可以計算它,而不必保存它,因爲它是以流格式下載的文件,這將是完美的。
我想有最直接的方法來做到這一點。
謝謝!
這裏是印第安納波利斯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
大多數編程語言都有庫可用於計算字符串或字節數組的MD5。在某些語言中,它們甚至是標準庫的一部分。我對Delphi並不熟悉,所以我不知道它是否適用於Delphi,但我想說它很可能就是這樣。爲Delphi搜索哈希和/或加密庫。
Indy帶有計算幾個哈希的函數,MD5就是其中之一。從至少Delphi 2006開始,Indy已經包含在Delphi的所有版本中,並且可以免費下載舊版本的版本。
正如你所提到的,the post you linked to談論wcrypt2
,這是一個密碼程序庫,包括MD5。您鏈接到的帖子似乎也表明它可用於Delphi 7,因爲提交者包括標記爲「Delphi 7」的輸出。你已經標記了這個問題delphi7
,所以我認爲這也是你正在使用的版本。那麼,什麼阻止你使用wcrypt2
?
該問題鏈接到的副本wcrypt2.pas,該文件中的版權日期似乎表明該設備在Delphi 7發佈時已經可用。檢查你的安裝;你可能已經擁有了它。如果沒有,那麼該單位也表示它是通過Project Jedi獲得的,所以你可以試着在那裏尋找單位。
您引用的問題的答案包括示例Delphi代碼和Delphi爲MD5提供的單元名稱。他們與德爾福2009年,所以你應該檢查他們是否也可用於您的版本。
在Delphi中查看MD5SUM的this implementation。它需要一個字符串輸入,但我想你可以很容易地使它與一個流。
MessageDigest_5也適用於此。
這是在Delphi 7中可用嗎?我沒有這個版本,所以我給出了答案的不確定性。 – 2009-01-15 22:22:38
@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
基於@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;
要將散列轉換爲hexstring,您還可以使用:TIdHashMessageDigest5.AsHex(hash); – 2009-01-16 21:07:50
什麼:
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;
我在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;
如果使用Overbyte http://www.overbyte.eu/frame_index.html只需添加單元和調用功能FileMD5與文件名
uses OverbyteIcsMd5;
....
function GetMd5File:String;
begin
Result := FileMD5(FileName);
end;
非常類似於此:http://stackoverflow.com/questions/1952929/md5- file-hashing-match-delphi-output-with-php-md5file-function – 2010-01-03 12:06:53