【问题标题】:Stream chaining in computing a checksum: avoiding memory issues计算校验和中的流链:避免内存问题
【发布时间】:2013-03-26 18:52:52
【问题描述】:

我有一个 FileStream 连接到一个 xml 文件,我想直接读入一个 SHA512 对象,以便为校验和计算哈希值(不是安全用途)。

问题是双重的:

  1. 我想省略xml中的一些节点,
  2. 文件很大,我宁愿不把整个文件加载到内存中

我可以将整个文件读入一个 xml 结构,删除节点,然后将其写入一个流,然后将其插入SHA512.ComputeHash,但这会导致性能损失。我希望能够以某种方式将节点删除作为对流的操作,然后以某种方式将流链接在一起形成一个可以传递给SHA512.ComputeHash(Stream)的流。

我怎样才能做到这一点?

【问题讨论】:

  • 源 XML 有多“大”?
  • 可能是这样的?使用 XmlReader 读取 XML 文件,将所有需要的节点写入 XmlWriter,XmlWriter 写入更新哈希的流。
  • @RichardTurner:源 XML 目前大约 30 MB 大,但我们假设它可能会比这大得多。是的,我知道这在某些情况下可能是微优化 - 请假设我知道我在做什么。
  • @dtb:问题是根据我的理解,如果我将 XMLWriter 写入内存流,该流将首先填满整个文件,然后它会传递给 ComputeHash .如果有意义的话,我希望进程像管道一样,随时在内存中保留部分 xml 文件。
  • 我不是说要写入 MemoryStream。我的意思是写入一个只更新哈希而不存储字节的流。

标签: c# xml xml-parsing stream checksum


【解决方案1】:
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;
}

【讨论】:

  • 有趣。我以前没见过这种方法。我会试试这个。
猜你喜欢
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 2010-12-01
  • 2015-12-21
相关资源
最近更新 更多