如何计算3 GB文件的校验和,但首先删除最后28个字节

Jos*_*ong 0 c# hash

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

是否可以使用FileStream或其他类型的流来计算SHA-1校验和散列,方法是从位置0读取流到位置[x - 28(附加校验和的长度)],而无需从物理上删除附加的校验和文件的结尾第一个?

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

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

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

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

Jon*_*eet 5

如果你知道你真正想要读取多少数据(即长度--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;
    }
}
Run Code Online (Sandbox Code Playgroud)