为文件夹创建哈希

我需要为文件夹创建哈希,其中包含一些文件。 我已经为每个文件完成了这个任务,但我正在搜索为文件夹中的所有文件创建一个哈希的方法。 任何想法如何做到这一点?

(当然我可以为每个文件创建哈希并将其连接到一些大哈希,但这不是我喜欢的方式)

提前致谢。

这将散列所有文件(相对)路径和内容,并正确处理文件排序。

它很快 – 就像一个4MB目录的30ms。

using System; using System.Text; using System.Security.Cryptography; using System.IO; using System.Linq; ... public static string CreateMd5ForFolder(string path) { // assuming you want to include nested folders var files = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories) .OrderBy(p => p).ToList(); MD5 md5 = MD5.Create(); for(int i = 0; i < files.Count; i++) { string file = files[i]; // hash path string relativePath = file.Substring(path.Length + 1); byte[] pathBytes = Encoding.UTF8.GetBytes(relativePath.ToLower()); md5.TransformBlock(pathBytes, 0, pathBytes.Length, pathBytes, 0); // hash contents byte[] contentBytes = File.ReadAllBytes(file); if (i == files.Count - 1) md5.TransformFinalBlock(contentBytes, 0, contentBytes.Length); else md5.TransformBlock(contentBytes, 0, contentBytes.Length, contentBytes, 0); } return BitConverter.ToString(md5.Hash).Replace("-", "").ToLower(); } 

邓肯的答案很有效; 但是,它不处理空目录。 下面的代码返回空目录的MD5’d41d8cd98f00b204e9800998ecf8427e’(0长度字符流的MD5)。

 public static string CreateDirectoryMd5(string srcPath) { var filePaths = Directory.GetFiles(srcPath, "*", SearchOption.AllDirectories).OrderBy(p => p).ToArray(); using (var md5 = MD5.Create()) { foreach (var filePath in filePaths) { // hash path byte[] pathBytes = Encoding.UTF8.GetBytes(filePath); md5.TransformBlock(pathBytes, 0, pathBytes.Length, pathBytes, 0); // hash contents byte[] contentBytes = File.ReadAllBytes(filePath); md5.TransformBlock(contentBytes, 0, contentBytes.Length, contentBytes, 0); } //Handles empty filePaths case md5.TransformFinalBlock(new byte[0], 0, 0); return BitConverter.ToString(md5.Hash).Replace("-", "").ToLower(); } } 

创建文件的tarball,散列tarball。

 > tar cf hashes *.abc > md5sum hashes 

或者将单个文件和管道输出散列为hash命令。

 > md5sum *.abc | md5sum 

编辑:上面的两种方法都不对文件进行排序,因此可能会为每次调用返回不同的哈希值,具体取决于shell如何扩展星号。

将文件名和文件内容连接成一个大字符串和散列,或者以块的forms进行散列以获得性能。

当然你需要考虑几件事:

  • 您需要按名称对文件进行排序,因此在案例文件顺序更改时不会获得两个不同的哈希值。
  • 使用此方法,您只需考虑文件名和内容。 如果文件名不计数,则可以先按内容排序,然后按哈希,如果有更多属性(ctime / mtime / hidden / archived ..)很重要,请将它们包含在待处理字符串中。

如果你已经有所有文件的哈希值,只需按字母顺序对哈希值进行排序,连接它们并再次哈希它们以创建一个超级哈希值。