如何获取代表文件集合的校验和?

问题描述 投票:0回答:2

我想弄清楚如果给定一组文件,其中任何一个文件是否发生了更改。

我知道对于单个文件,您可以使用这种方法来获取校验和值,您可以使用该值来检查是否发生了更改。 IE。这将为给定文件返回相同的值,直到该文件中的某些内容发生更改,然后它将生成不同的哈希值:

byte[] hashBytes;
using(var inputFileStream = File.Open(filePath))
{
    var md5 = MD5.Create();
    hashBytes = md5.ComputeHash(inputFileStream);
}

string s = Convert.ToBase64String(hashBytes);

有没有办法获取哈希值的集合并从该集合中获取哈希值?

List<byte[]> hashCollection = SomeFunctionThatReturnsListByteArray();
//some approach that can create a hash of this

我的主要目标是检测是否发生了变化。 我不在乎哪个文件被改变了。

c# arrays hash md5 checksum
2个回答
2
投票

散列哈希值并不是最佳的。但是,如果您不想将所有文件散列在一起,您可以轻松地将散列添加到内存流并对其进行散列。

忽略任何其他概念或其他问题。

public static byte[] Hash(IEnumerable<byte[]> source)
{
   using var hash = SHA256.Create();
   var ms = new MemoryStream();
   foreach (var bytes in source)
      ms.Write(bytes, 0, bytes.Length);
   ms.Seek(0, SeekOrigin.Begin);
   return hash.ComputeHash(ms);
}

注意:我并不是说这是最好的解决方案,它只是解决您当前问题的解决方案

稍微减少分配的方法

public static byte[] Hash(IList<byte[]> source)
{
   using var hash = SHA256.Create();
   var ms = new MemoryStream(source.Sum(x =>x.Length));
   foreach (var bytes in source)
      ms.Write(bytes, 0, bytes.Length);
   ms.Seek(0, SeekOrigin.Begin);
   return hash.ComputeHash(ms);
}

对于多文件哈希(未经测试)

public static byte[] Hash(IEnumerable<string> source)
{

   using var hash = SHA256.Create();
   hash.Initialize();

   // adjust to what is fastest for you, for hdd 4k to 10k might be appropriate.
   // for ssd larger will likely help
   // probably best to keep it under 80k so it doesn't end up on LOH (up to you)
   const int bufferSize = 1024 * 50; 

   var buffer = new byte[bufferSize];
   foreach (var file in source)
   {
      using var fs = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Delete, bufferSize, FileOptions.SequentialScan);
      var bytesRead = 0;
      while ((bytesRead = fs.Read(buffer, 0, bufferSize)) != 0)
         hash.TransformBlock(buffer, 0, bytesRead, buffer, 0);
      hash.TransformFinalBlock(buffer, 0, 0);
   }

   return hash.Hash;
}

0
投票

我也在找这个问题。我的解决方案之一是你可以将所有文件压缩到zip文件中,然后获取zip文件的校验和。

© www.soinside.com 2019 - 2024. All rights reserved.