2013-03-26 76 views
2

我有一個FileStream連接到一個xml文件,我想直接讀入SHA512對象以便爲校驗和計算散列(而不是安全用途)。計算校驗和時的流鏈接:避免內存問題

的問題是雙重的:

  1. 我想省略一些在XML節點,
  2. 文件是相當大的,我寧願不整件事裝入到內存

我可以將整個文件讀入xml結構,刪除節點,然後將其寫入一個流,然後插入SHA512.ComputeHash,但這會導致性能下降。我寧願能夠以某種方式刪除節點作爲流上的操作,然後以某種方式將流連接在一起成爲可傳遞到SHA512.ComputeHash(Stream)的單個流。

我該如何做到這一點?

+0

「large」是源XML嗎? – 2013-03-26 19:01:23

+0

也許這樣?用XmlReader讀取XML文件,將所有需要的節點寫入一個XmlWriter,該XmlWriter寫入更新散列的流。 – dtb 2013-03-26 19:01:27

+0

@RichardTurner:源XML目前大約有30 MB,但讓我們假設它可能比這個大得多。是的,我知道這可能是在某些情況下的微觀優化 - 請假設我知道我在做什麼。 – skybluecodeflier 2013-03-26 19:05:03

回答

0
using (var hash = new SHA512Cng()) 
using (var stream = new CryptoStream(Stream.Null, hash, CryptoStreamMode.Write)) 
using (var writer = XmlWriter.Create(stream)) 
using (var reader = XmlReader.Create("input.xml")) 
{ 
    while (reader.Read()) 
    { 
     // ... write node to writer ... 
    } 

    writer.Flush(); 
    stream.FlushFinalBlock(); 
    var result = hash.Hash; 
} 
+0

有趣。我從來沒有見過這樣做的方法。我會試試這個。 – skybluecodeflier 2013-03-26 19:35:23