我目前只使用SHA1哈希文件的程序。沒有其他選擇。它使用作爲Lazarus和Free Pascal編譯器一部分的SHA1哈希函數對它們進行哈希處理。如何將一個較大的緩衝區傳遞給DCPCrypt「UpdateStream」程序
我已經使用DCPCrypt庫(http://wiki.lazarus.freepascal.org/DCPcrypt或http://www.cityinthesky.co.uk/opensource)添加了使用MD5,SHA256和SHA512的功能。一切工作正常,但是,如果文件大於1Mb,我的早期版本會將文件散列在2Mb緩衝區中。如果是小於1MB,它使用1024個字節的默認緩衝區,就像這樣:
if SizeOfFile > 1048576 then // if > 1Mb
begin
fileHashValue := SHA1Print(SHA1File(NameOfFileToHash, 2097152)); //2Mb buffer
end
else
fileHashValue := SHA1Print(SHA1File(NameOfFileToHash)); //1024 byte buffer
然而,我的散列函數和過程現在已經移動到一個單選按鈕狀態控制功能單一,使我代碼更多的面向對象。它基本上具有編碼在其中的所有4個散列選項,並且哪個節運行取決於程序找到哪個RadioButton.Checked狀態。 SHA1的代碼,例如,現在看起來是這樣的:
..
SourceData := TFileStream.Create(FileToBeHashed, fmOpenRead);
..
else if SHA1RadioButton2.Checked = true then
begin
varSHA1Hash := TDCP_SHA1.Create(nil);
varSHA1Hash.Init;
varSHA1Hash.UpdateStream(SourceData, SourceData.Size); // HOW DO I ADD A BUFFER HERE?
varSHA1Hash.Final(DigestSHA1);
varSHA1Hash.Free;
for i := 0 to 19 do // 40 character output
GeneratedHash := GeneratedHash + IntToHex(DigestSHA1[i],2);
end // End of SHA1 if
我的問題是我怎麼緩衝區大小添加到varSHA1Hash.UpdateStream發現的文件是「大」(比如,大於1MB)?這很重要,因爲例如,300Mb文件在我的早期版本中需要4秒鐘,而現在需要9秒鐘才能使用DCPCrypt庫的「改進」版本!因此,即使我的代碼讀得更好,它也會使大文件的時間增加一倍。如果我能得到varSHA1Hash.UpdateStream到幾MB的數據,以一定的時間,而不是8K字節的緩衝區讀取(該程序UpdateStream呢,如果你讀的代碼庫),這將使它更快。就目前而言,我的理解是varSHA1Hash.UpdateStream(SourceData,SourceData.Size);基本上讀取正在讀取的文件的整個大小作爲緩衝區?
如果有幫助,下面是
procedure TDCP_hash.UpdateStream(Stream: TStream; Size: longword);
var
Buffer: array[0..8191] of byte;
i, read: integer;
begin
dcpFillChar(Buffer, SizeOf(Buffer), 0);
for i:= 1 to (Size div Sizeof(Buffer)) do
begin
read:= Stream.Read(Buffer,Sizeof(Buffer));
Update(Buffer,read);
end;
if (Size mod Sizeof(Buffer))<> 0 then
begin
read:= Stream.Read(Buffer,Size mod Sizeof(Buffer));
Update(Buffer,read);
end;
end;
的UpdateStream程序我也看了一些其他的庫,如Delphi加密Compedium(http://home.netsurf.de/wolfgang.ehrhardt/ crchash_en.html)和沃爾夫岡·埃爾哈特庫(http://www.torry.net/pages.php?id=519#939342),並且還附帶DoubleCommander的一個,但VARIOS原因(simplicty是一個)我試圖用DCPCrypt來做到這一點。
嗨。這是我開始實際得出的結論,所以謝謝你澄清我的觀點。我認爲我要做的是對這兩個單選按鈕使用MD5和SHA1 FPC功能,然後對SHA256和SHA512使用DCPCrypt。雖然我承認這兩項計算不會大規模計算,但至少它爲用戶提供了選項,這是我的目標。我只是想盡可能快地嘗試。再次感謝 –