使用 md5 哈希或文件长度进行文件比较?

File comparison using md5 hash or length of a file?

我在磁盘上有一个文件列表,我需要获取这些文件并将其加载到内存中。我创建了一个 FileConfig class,如下所示,其中包含每个文件的所有元数据。

public class FileConfig
{
    public string FileName { get; set; }
    public DateTime Date { get; set; }
    public string FileContent { get; set; }
    public string MD5Hash { get; set; }
}

每个文件都有一个 MD5Hash 字符串,这样我可以稍后将它与其他一些文件进行比较,以确定特定文件是否不同。

下面是我的代码,我从磁盘中获取所有文件的列表,然后从中列出 FileConfig 对象。

private IEnumerable<FileConfig> LoadFiles(string path)
{
    IList<string> files = procUtility.GetListOfFiles(path);
    if (files == null || files.Count == 0) { yield return default; }

    for (int i = 0; i < files.Count; i++)
    {
        var cfgPath = files[i];
        if (!File.Exists(cfgPath)) { continue; }
        var date = File.GetLastWriteTimeUtc(cfgPath);
        var content = File.ReadAllText(cfgPath);
        var pathPieces = cfgPath.Split(System.IO.Path.DirectorySeparatorChar, StringSplitOptions.RemoveEmptyEntries);
        var fileName = pathPieces[pathPieces.Length - 1];
        var md5Hash = procUtility.GetMD5Hash(cfgPath);
        yield return new FileConfig
        {
            FileName = fileName,
            Date = date,
            FileContent = content,
            MD5Hash = md5Hash
        };
    }
}

我最后的目标是比较文件(并将文件内容用于其他目的)所以我在 FileConfig class 中使用每个文件的 MD5Hash 字符串并且弄清楚它们是否不同,如下所示:

!newFile.MD5Hash.Equals(oldFile.First().MD5Hash)

有什么更好的方法可以让我在我的FileConfigclass中继承FileInfoclass,然后使用每个文件的length方法来做比较?或者我有什么在这里没问题?

你有的很好。 md5sum 旨在根据文件内容生成哈希;即使是轻微的字节差异也会产生不同的哈希值。通过比较 md5sums 产生误报的机会有数百万,并且文件的内容必须完全不同才能有这种机会。

但是,在您的情况下,逐字节比较可能更快,因为生成校验和会加载文件的每个字节,然后对其进行处理。如果您确实需要逐字节比较,请使用 System.IO.FileInfoFile.ReadAllBytes(FileInfo fileName).SequenceEqual(File.ReadAllBytes(FileInfo fileName)

字节比较以第一个差异结束,这是我们假设它比比较 md5sums 更快的地方,因为 md5 哈希生成器不会以差异结束。

您还可以在 non-binary 个文件上使用以下内容:

File.ReadLines(file).SequenceEqual(File.ReadLines(file))

至于按长度比较,你永远不应该依赖它。向其添加检查几乎没有任何好处,并且仅依靠检查产生的误报数不胜数。