繁体   English   中英

快速文件完整性验证

[英]Fast file integrity verification

有没有一种快速算法可以比较两个文件(出于验证目的)而无需读取全部内容?

您可以在两个文件上使用MD5哈希值,然后进行比较。 但是,它确实会读取整个文件。 如果不进行检查,您将无法100%确定。

在C#中,可以通过以下方式做到这一点(对不起,您没有提到特定的语言):

protected string GetMD5HashFromFile(string fileName)
{
    byte[] retVal = { };

    using (FileStream file = new FileStream(fileName, FileMode.Open))
    using (MD5 md5 = new MD5CryptoServiceProvider())
    {
        retVal = md5.ComputeHash(file);
    }

    if (retVal.Length > 0)
    {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < retVal.Length; i++)
        {
            sb.Append(retVal[i].ToString("x2"));
        }

        return sb.ToString();
    }
    else
    {
        return string.Empty;
    }
}

bool CompareFiles(string fileName1, string fileName2)
{
    return (GetMD5HashFromFile(fileName1) == GetMD5HashFromFile(fileName2));
}

您可以编写一个自定义的CRC过程来读取文件的位。 例如,每1k需要16个字节或类似的内容,而不是对整个文件进行CRC处理。 当然,这会带来更大的风险,因为数据可能会在您不看的地方发生变化,并且不会影响您比较的数据块。 但是CRC也有一点风险,因为两个非常不同的数据集可以返回相同的值。

除非您读取每个字节,否则没有算法可以100%确保文件相同。 证明很简单-假设存在这样的算法,然后我们将其用于比较两个文件。 这意味着该算法未读取一定数量的字节。 我可以通过更改一个文件而不是其他文件中的字节来使算法失败。

从数学上讲不可能在不完全读取两个文件的情况下确定相等大小的两个文件相等,但是在不完全读取两个文件的情况下,确定它们是否相等是非常有可能的。 这可以通过各种方式来完成,例如使用哈希函数或短路比较。

恐怕您无法避免完全读取两个文件以完全确保它们相等。

您可以先检查两个文件的大小; 如果它们不同,则文件是不同的(但是仅在行分隔符上不同的文本文件呢?)。

如果大小相同,我看不到任何进一步的正确方法,而是开始读取两个文件。 当然,只要缓冲区不同,它就可以停止,但是只能说明在处理完最后一个字符时文件确实相等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM