这个问题 提到了wcrypt2。

我需要的只是计算一个文件的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

其他提示

基于@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;

印附带功能,用于计算几个散列,MD5是其中之一。印地包含在自2006年德尔福和可用的免费下载的旧版本至少德尔福的所有版本。

约什么:

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。您链接到的帖子似乎还表明它适用于Delphi 7,因为Asker包含标记为“ Delphi 7”的输出。你已经标记了这个问题 delphi7, ,所以我假设这也是您正在使用的版本。那么是什么阻止你使用 wcrypt2?

该问题链接到以下副本 wcrypt2.pas, ,并且该文件中的版权日期似乎表明该单元在 Delphi 7 发布时可用。检查您的安装;你可能已经拥有了。如果不是,那么该单位还说它是通过以下方式获得的 绝地计划, ,所以您也可以尝试在那里寻找该单位。

您所引用问题的答案包括示例 Delphi 代码以及 Delphi 附带的用于执行 MD5 的单元名称。它们随 Delphi 2009 一起提供,因此您应该检查它们是否也适用于您的版本。

看一看 MD5SUM的在Delphi此实现。它需要输入一个字符串,但我想,你可以很容易地将其与流工作。

MessageDigest_5 将这种正常工作。

我用在Delphi 7下面的函数与印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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top