【发布时间】:2020-07-06 17:00:45
【问题描述】:
我有一个大文件(源文件(假设 10GB)),我需要按块读取它,压缩并散列它。 (最后,我们有两个输出:字符串格式的文件哈希(md5HashHex)和字节格式的压缩文件(destData)。) 同样在压缩之前,我需要向目标(destData)添加一个标头并对其进行哈希处理。之后,需要打开源文件并逐块读取,压缩和散列每个块。我发现当我逐块读取文件时,我的散列会有所不同,比较一次做散列。这是我的代码,如果您能帮助我,我将不胜感激。另外我想知道我是否正确地进行了压缩。谢谢你。
public static void CompresingHashing(string inputFile)
{
MD5 md5 = MD5.Create();
int byteCount = 0;
var length = 8192;
var chunk = new byte[length];
byte[] destData;
byte[] compressedData;
byte[] header;
header = Encoding.ASCII.GetBytes("HEADER");
md5.TransformBlock(header, 0, header.Length, null, 0);
destData = AppendingArrays(destData, header); //destination
using (FileStream sourceFile = File.OpenRead(inputFile))
{
while ((byteCount = sourceFile.Read(chunk, 0, length)) > 0)
{
using (var ms = new MemoryStream())
{
using (ZlibStream result = new ZlibStream(ms, CompressionMode.Compress, CompressionLevel.Default)
result.Write(chunk, 0, chunk.Length);
}
compressedData = ms.ToArray();
md5.TransformBlock(compressedData, 0, compressedData.Length, null, 0);
destData = AppendingArrays(destData, compressedData);
}
md5.TransformFinalBlock(chunk, 0, 0);
byte[] md5Hash = md5.Hash;
string md5HashHex = string.Join(string.Empty, md5Hash.Select(b => b.ToString("x2")));
}
Console.WriteLine("Hash : " + hash);
}
public static byte[] AppendingArrays(byte[] existingArray, byte[] ArrayToAdd)
{
byte[] newArray = new byte[existingArray.Length + ArrayToAdd.Length];
existingArray.CopyTo(newArray, 0);
ArrayToAdd.CopyTo(newArray, existingArray.Length);
return newArray;
}
但如果我对 destData (即源文件 + 标头)进行哈希处理,我会得到不同的结果:(为了篇幅,我没有重复代码)
.
.
.
destData = AppendingArrays(destData, compressedData);
byte[] md5Hash = md5.ComputeHash(data);
.
.
.
【问题讨论】:
标签: c# .net hash compression md5