【问题标题】:Zlib Compressing and MD5 Hashing in C#C# 中的 Zlib 压缩和 MD5 散列
【发布时间】: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


    【解决方案1】:

    看起来您在 md5 上处理了最后一个块两次。只需使用 byte[0] 和长度和偏移量 0 调用 TransformFinalBlock

    【讨论】:

    • 感谢您的回复,我将此代码用于TransformFinalBlock,但散列不正确。byte[] data2 = Encoding.ASCII.GetBytes(""); md5.TransformFinalBlock(data, 0, 0);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多