2009-01-02 20 views
1

我必須驗證可能與2Gb一樣大的文件上的簽名,並且我希望以儘可能節省內存的方式進行驗證。由於各種原因,文件已經完全加載到內存中,並且可以通過應用程序使用InputStream進行訪問。我想驗證使用流接口的簽名,但JCA Signature類'update方法只接受byte[]和相關的類。使用JCA有效檢查大型數據集上的簽名使用JCA

我怎麼能這樣做有效地?我不想將野獸加載到第二個字節數組中,否則我們會看到一些嚴重的內存使用,但接口似乎不支持它。

更新

如果它的事項,簽約算法SHA-1

回答

2

爲什麼不直接讀取輸入一次流塊(無論大小方便4096bytes或),調用update()爲每個塊。

+0

我喜歡它的聲音; update()刷新先前更新的塊嗎? – 2009-01-02 21:26:40

1

創建一個字節數組充當緩衝區並且每次從InputStream讀取緩衝區,每次調用Signature的update()。如果緩衝區的大小合理,那麼將數據從一個進程轉移到另一個進程所花費的CPU時間(我猜這就是你在做什麼?)與計算時間相比可能是微不足道的。在從磁盤讀取的情況下,CPU使用率忽略不計的返回值的截止點似乎是一個8K左右的緩衝區大小,我懷疑這也會或多或少地適用於您的情況。 (如果它很有趣,請參閱我放在InputStream buffer sizes上的頁面。)