环境:3 GB数据文件,末尾附加28字节SHA-1校验和.
是否可以使用FileStream或其他类型的流来计算SHA-1校验和散列,方法是从位置0读取流到位置[x - 28(附加校验和的长度)],而无需从物理上删除附加的校验和文件的结尾第一个?
目前我们使用FileStream打开文件,然后使用BinaryReader读取它以查找和读取文件的最后28个字节.
然后使用FileStream再次打开文件,并将流的长度设置为长度--28个字节,这将从文件中删除校验和.
最后,我们计算数据文件的校验和,删除最后28个字节,然后将其与我们从文件末尾删除的校验和进行比较,以确保校验和匹配.
基本上我想知道是否可以计算文件数据部分的校验和,而不必先删除附加的校验和.
如果你知道你真正想要读取多少数据(即长度--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)
| 归档时间: |
|
| 查看次数: |
677 次 |
| 最近记录: |