質問

この質問には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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top