سؤال
في يذكر هذا السؤال و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;