【问题标题】:How to calculate checksum for 3 GB file but first remove the last 28 bytes如何计算 3 GB 文件的校验和,但首先删除最后 28 个字节
【发布时间】:2012-07-07 08:52:33
【问题描述】:

环境: 3 GB 数据文件,末尾附加 28 字节 SHA-1 校验和。

是否可以使用 FileStream 或其他类型的流通过从位置 0 读取流到位置 [x - 28(附加校验和的长度)] 来计算 SHA-1 校验和哈希,而无需物理删除首先从文件末尾附加校验和?

目前我们使用 FileStream 打开文件,然后使用 BinaryReader 来查找和读取文件的最后 28 个字节。

然后使用 FileStream 再次打开文件并将流的长度设置为长度 - 28 字节,这将从文件中删除校验和。

最后,我们计算数据文件的校验和,去掉最后 28 个字节,然后将其与我们从文件末尾删除的校验和进行比较,以确保校验和匹配。

基本上我想知道是否可以计算文件数据部分的校验和,而不必先删除附加的校验和。

【问题讨论】:

    标签: c# hash


    【解决方案1】:

    如果您知道真正想要读取多少数据(即长度 - 28 字节),那么当您计算哈希时,只需输入那么多数据。您还没有确切说明您是如何计算散列的,但是您通常可以重复地将更多数据“写入”到散列计算中 - 只要您需要,只要这样做,直到您到达最后 28 个字节。

    示例:

    public byte[] Sha1ExceptEnd(Stream input, int bytesToOmit)
    {
        long bytesToRead = input.Length - bytesToOmit;
        byte[] buffer = new byte[16 * 1024]; // Hash up to 16K at a time
        using (SHA1 sha1 = SHA1.Create())
        {
            while (bytesToRead > 0)
            {
                int thisPass = (int) Math.Min(buffer.Length, bytesToRead);
                int bytesReadThisPass = input.Read(buffer, 0, thisPass);
                if (bytesReadThisPass <= 0)
                {
                    throw new IOException("Unexpected end of data");
                }  
                sha1.TransformBlock(buffer, 0, bytesReadThisPass, buffer, 0);
                bytesToRead -= bytesReadThisPass;
            }
            // Flush the hash
            sha1.TransformFinalBlock(buffer, 0, 0);
            return sha1.Hash;
        }
    }
    

    【讨论】:

    • 我假设他们使用的是ComputeHash
    • @Lucero:是的,虽然我的方法有点曲折——但最终还是成功了。
    • Jon 我正在使用 SHA1CryptoServiceProvider 并调用传入 FileStream 的 ComputeHash 方法。
    • @hype8912:是的 - 虽然您可以编写一个长度限制流,但这很棘手。请改用我给出的代码 - 您可能希望将其修改为 SHA1CryptoServiceProvider,但它应该没问题。
    • @Jon,我的猜测(现在已经确认)只是基于他们的描述。我会采取与您解决手头任务相同的方法;为此 +1 ;)
    【解决方案2】:

    花哨的方法是创建包装器 Stream 对象,该对象将读取给定底层流的子部分。这样您就可以为 FileStream 的每个子部分构造其他对象(如阅读器)。

    直接从您感兴趣的范围内的流中读取字节会容易得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 2019-06-26
      相关资源
      最近更新 更多