Сжатие Zlib и хеширование MD5 в C# - PullRequest
0 голосов
/ 26 марта 2020

У меня есть большой файл (исходный файл (при условии 10 ГБ)), который мне нужно прочитать его кусками, сжать и получить sh. (Наконец, у нас есть два вывода: ha sh файла в строковом формате (md5HashHex) и сжатый файл в байтовом формате (destData).) Также перед сжатием мне нужно добавить заголовок к месту назначения (destData) и ха sh это. После этого нужно открыть исходный файл и прочитать его по чанку, сжать и ха sh каждый чанк. Я обнаружил, что мое хэширование будет отличаться, когда я читаю фрагмент файла с помощью фрагмента, сравнивая его с ha sh в одном go. Вот мой код, я ценю, если вы можете помочь мне с этим. Также я хотел бы знать, правильно ли я делаю сжатие. Спасибо.

    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;
    }

Но если у меня есть sh destData (который является исходным файлом + заголовок), я получил другой результат: (ради места, я не повторял код)

.
.
.
destData = AppendingArrays(destData, compressedData);
byte[] md5Hash = md5.ComputeHash(data);
.
.
.

1 Ответ

0 голосов
/ 30 марта 2020

Похоже, вы обрабатываете последний кусок дважды на md5. Просто позвоните TransformFinalBlock с byte[0], длиной и смещением 0.

...