【问题标题】:File comparison using md5 hash or length of a file?使用 md5 哈希或文件长度进行文件比较?
【发布时间】:2020-08-06 05:43:56
【问题描述】:

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

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 类中每个文件的MD5Hash 字符串并弄清楚它们是否不同下面:

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

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

【问题讨论】:

  • 用长度做比较?当然可以,但是你会得到比 CRC 或散列更多的误报

标签: c# asp.net-core md5sum


【解决方案1】:

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

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

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

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

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

至于按长度进行比较,您永远不要依赖它。向其中添加检查几乎没有任何好处,而且仅依赖检查产生的误报数不胜数。

【讨论】:

    猜你喜欢
    • 2021-09-27
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多