转自:.NET CORE下最快比较两个文件内容是否相同的方法 - WAKU - 博客园 (cnblogs.com)
本文因为未考虑磁盘缓存, 结果不是很准确, 更严谨的结果请参看本博文的续集
最近项目有个需求,需要比较两个任意大小文件的内容是否相同,要求如下:
- 项目是.NET CORE,所以使用C#进行编写比较方法
- 文件大小任意,所以不能将文件内容全部读入到内存中进行比较(更专业点说,需要使用非缓存的比较方式)
- 不依赖第三方库
- 越快越好
为了选出最优的解决方案,我搭建了一个简单的命令行工程,准备了两个大小为912MB的文件,并且这两个文件内容完全相同.在本文的最后,你可以看到该工程的Main方法的代码.
下面我们开始尝试各个比较方法,选出最优的解决方案:
比较两个文件是否完全相同,首先想到的是用哈希算法(如MD5,SHA)算出两个文件的哈希值,然后进行比较.
废话少说,撸起袖子写一个MD5比较方法:
/// <summary>
/// MD5
/// </summary>
/// <param name="file1"></param>
/// <param name="file2"></param>
/// <returns></returns>
private static bool CompareByMD5(string file1, string file2)
{
// 使用.NET内置的MD5库
using (var md5 = MD5.Create())
{
byte[] one, two;
using (var fs1 = File.Open(file1, FileMode.Open))
{
// 以FileStream读取文件内容,计算HASH值
one = md5.ComputeHash(fs1);
}
using (var fs2 = File.Open(file2, FileMode.Open))
{
// 以FileStream读取文件内容,计算HASH值
two = md5.ComputeHash(fs2);
}
// 将MD5结果(字节数组)转换成字符串进行比较
return BitConverter.ToString(one) == BitConverter.ToString(two);
}
}
比较结果:
Method: CompareByMD5, Identical: True. Elapsed: 00:00:05.7933178
耗时5.79秒,感觉还不错.然而,这是最佳的解决方案吗?
其实我们仔细想一下,答案应该是否定的.
因为任何哈希算法本质上都是对字节进行一定的计算,而计算过程是要消耗时间的.
很多下载网站上提供了下载文件的哈希值,那是因为下载的源文件本身不会改变,只需要计算一次源文件的哈希值,提供给用户验证即可.
而我们的需求中,两个文件都是不固定的,那么每次都要计算两个文件的哈希值,就不太合适了.
所以,哈希比较这个方案被PASS.
这种求算法最优解的问题,我以往的经验是: 去stackoverflow查找
标签:文件,字节,READ,最快,BYTES,two,NET,Open,byte From: https://www.cnblogs.com/wjblack/p/17592568.html