2011-10-31 27 views
2

我目前只使用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來做到這一點。

回答

3

要回答你的問題:你不能將一個不同的大小,但您可以在dcpcrypt2.pas在你所提到的方法改變數組的大小,並重新編譯DCPCrypt,它是OSS畢竟。

但是這並沒有多大幫助,因爲fpc的sha1單元並不是因爲較大的緩衝區大小而變得更快,而是因爲sha1算法的實現更快,所以它使用編譯器內在函數來旋轉值使用sha1算法的操作。

只是具有不同數值的命令行參數(例如8192和8388608)下面的程序:

uses 
    sysutils,sha1; 

begin 
    writeln(SHA1Print(SHA1File('bigfile',StrToInt(paramstr(1))))); 
end. 

至少我的PC上並沒有區別如果緩衝區8K或8M。如果你使用像1024這樣的較低值,你會看到稍微減慢(10-20%)。

+0

嗨。這是我開始實際得出的結論,所以謝謝你澄清我的觀點。我認爲我要做的是對這兩個單選按鈕使用MD5和SHA1 FPC功能,然後對SHA256和SHA512使用DCPCrypt。雖然我承認這兩項計算不會大規模計算,但至少它爲用戶提供了選項,這是我的目標。我只是想盡可能快地嘗試。再次感謝 –

相關問題