Контрольная сумма файла MD5 - PullRequest
4 голосов
/ 15 января 2009

В этот вопрос упоминается wcrypt2.

Мне нужно просто рассчитать MD5 файла. Было бы идеально, если бы я мог рассчитать его без сохранения, потому что это загруженный файл в потоковом формате.

Я бы хотел найти самый простой способ сделать это.

Спасибо!

Ответы [ 9 ]

12 голосов
/ 20 октября 2010

Вот рабочий код для 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

5 голосов
/ 16 января 2009

На основании @dummzeuch и я написал эту функцию:

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;
3 голосов
/ 15 января 2009

Indy поставляется с функциями для расчета нескольких хешей, MD5 является одним из них. Indy входит во все версии Delphi начиная с версии Delphi 2006 и доступна для бесплатной загрузки для более старых версий.

2 голосов
/ 27 марта 2013

А как же:

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;
1 голос
/ 16 января 2009

MessageDigest_5 также будет работать для этого.

1 голос
/ 15 января 2009

Взгляните на эту реализацию MD5SUM в Delphi. Для ввода требуется строка, но я думаю, вы можете легко заставить ее работать с потоком.

1 голос
/ 15 января 2009

Как вы упомянули, сообщение, которое вы связали с , говорит о wcrypt2, который является библиотекой криптографических процедур, включая MD5. Пост, на который вы ссылаетесь, также указывает на то, что он доступен для Delphi 7, поскольку в запросе есть вывод с пометкой «Delphi 7». Вы пометили этот вопрос delphi7, поэтому я полагаю, что вы тоже используете эту версию. Так что же мешает вам использовать wcrypt2?

Вопрос связан с копией wcrypt2.pas , и даты авторских прав в этом файле указывают на то, что устройство было доступно к моменту выпуска Delphi 7. Проверьте вашу установку; Вы могли бы уже иметь это. Если нет, то устройство также говорит, что оно было получено с помощью Project Jedi , так что вы можете попробовать поискать там и устройство.

Ответы на ваш указанный вопрос включают пример кода Delphi и названия модулей, которые поставляются с Delphi для выполнения MD5. Они поставляются с Delphi 2009, поэтому вам следует проверить, доступны ли они и для вашей версии.

0 голосов
/ 29 августа 2017

Если вы используете Overbyte http://www.overbyte.eu/frame_index.html, просто добавьте модуль и вызовите функцию FileMD5 с именем файла

uses OverbyteIcsMd5;
....
function GetMd5File:String; 
begin
 Result := FileMD5(FileName);
end;
0 голосов
/ 26 августа 2017

Я использую следующую функцию в 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;
...