سؤال

في يذكر هذا السؤال و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 كتبت هذه الوظيفة:

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. والمشاركة التي ترتبط يبدو أيضا أن تشير إلى أنه يتوفر للدلفي 7 منذ السائل يشمل الانتاج المسمى "دلفي 7." لقد قمت بوضع علامات هذا delphi7 السؤال، لذلك أفترض أن هذا هو الإصدار الذي تستخدمه أيضا. ذلك ما يمنعك من استخدام wcrypt2؟

ويبدو أن الروابط السؤال على نسخة من wcrypt2.pas ، وتواريخ المؤلف في هذا الملف للإشارة إلى أن وحدة كانت متاحة في الوقت صدر دلفي 7. تحقق من التثبيت. قد يكون لديك بالفعل. إذا لم يكن كذلك، ثم يقول الوحدة أيضا تم الحصول عليها عن طريق مشروع جدي ، لذلك يمكن أن حاول البحث هناك وحدة أيضا.

وتتضمن إجابات على سؤالك المشار سبيل المثال دلفي رمز وأسماء الوحدات التي تأتي مع دلفي للقيام MD5. أنها تأتي مع دلفي 2009، لذا يجب عليك مراجعة عما إذا كانت متاحة للإصدار الخاص بك أيضا.

ونلقي نظرة على هذا التنفيذ من MD5SUM في دلفي. فهو يتطلب سلسلة لإدخال، ولكن أتصور يمكنك بسهولة جعل ذلك العمل مع دفق.

MessageDigest_5 ستعمل لهذا أيضا.

وأنا استخدم الدالة التالية في دلفي 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