質問
この質問にはwcrypt2が記載されています。
必要なのは、単にファイルのMD5を計算することです。ストリーム形式のダウンロードファイルであるため、保存せずに計算できれば完璧です。
それを行う最も簡単な方法が欲しいです。
ありがとう!
解決
Indy 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
他のヒント
@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;
Indyには、いくつかのハッシュを計算するための関数が付属しています。MD5もその1つです。 Indyは少なくともDelphi 2006以降のすべてのバージョンのDelphiに含まれており、古いバージョン用の無料ダウンロードとして利用できます。
概要:
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;
おっしゃるように、リンクした投稿はwcrypt2
について語っていますが、 MD5を含む暗号化ルーチンのライブラリです。リンクした投稿は、askerに<!> quot; Delphi 7。<!> quot;というラベルの付いた出力が含まれているため、Delphi 7でも利用できることを示しているようです。この質問にタグdelphi7
を付けたので、それもあなたが使用しているバージョンだと思います。では、<=>の使用を妨げているのは何ですか?
質問は wcrypt2.pas のコピーにリンクしており、そのファイルの著作権日付は、Delphi 7がリリースされるまでにユニットが利用可能であったことを示しているようです。インストールを確認してください。あなたはすでにそれを持っているかもしれません。そうでない場合、ユニットは Project Jedi を介して取得したことも示すので、探してみてください。ユニットにも同様です。
参照した質問への回答には、Delphiコードの例と、MD5を実行するためにDelphiに付属しているユニットの名前が含まれています。 Delphi 2009に同梱されているため、ご使用のバージョンでも利用できるかどうかを確認する必要があります。
DelphiのMD5SUMのこの実装をご覧ください。入力には文字列が必要ですが、ストリームで簡単に機能させることができると思います。
MessageDigest_5 も同様に機能します。
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;
オーバーバイト http://www.overbyte.eu/frame_index.html を使用する場合ユニットを追加し、ファイル名で関数FileMD5を呼び出すだけです
uses OverbyteIcsMd5;
....
function GetMd5File:String;
begin
Result := FileMD5(FileName);
end;