是否有任何快速算法可以比较两个文件(用于验证目的)而无需读取整个内容?
答案 0 :(得分:2)
您可以在两个文件上使用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));
}
答案 1 :(得分:1)
您可以编写一个自定义CRC过程来读取文件的位。例如每1k或类似的16字节而不是CRC整个文件。当然,风险更大,因为数据可能会在您不看的地方发生变化,并且不会对您的比较块产生影响。但CRC也有一点风险,因为两个非常不同的数据集可以返回相同的值。
答案 2 :(得分:1)
除非您读取每个字节,否则没有算法可以100%确定文件是否相同。证明很简单 - 假设存在这样的算法,我们用它来比较两个文件。这意味着算法不会读取一定数量的字节。我可以通过在一个文件中更改那些字节而不是另一个文件来使算法失败。
答案 3 :(得分:1)
在数学上不可能确定两个相同大小的文件是相同的而不完全读取它们两者,但是很有可能确定它们不等于而不完全读取它们。这可以通过各种方式完成,例如使用散列函数或短路比较。
答案 4 :(得分:0)
我担心你无法避免完全阅读这两个文件,以确保它们是平等的。
您可以先检查两个文件的大小;如果它们不同,那么文件是不同的(但是文本文件只会在行分隔符上有所不同?)。
如果大小相同,我没有看到任何正确的方法,但开始阅读这两个文件。当然,只要缓冲区不同,它就可以停止,但它只能说明当处理完最后一个字符时,文件真正等于。