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

cs9*_*s98 3 c# md5sum asp.net-core

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

public class FileConfig
{
    public string FileName { get; set; }
    public DateTime Date { get; set; }
    public string FileContent { get; set; }
    public string MD5Hash { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

我最后的目标是比较文件(也可以将文件内容用于其他目的),因此我MD5Hash在类中使用每个文件的字符串FileConfig并确定它们是否不同,如下所示:

!newFile.MD5Hash.Equals(oldFile.First().MD5Hash)
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法可以FileInfo在我的类中继承类FileConfig,然后使用length每个文件的方法进行比较?或者我这里有什么可以吗?

ben*_*sop 5

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

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

字节比较在第一个差异处结束,我们假设它比比较 md5sums 更快,因为 md5 哈希生成器不会在差异处结束。

您还可以对非二进制文件使用以下内容:

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

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