首页 > 其他分享 >.NET 下最快比较两个文件内容是否相同

.NET 下最快比较两个文件内容是否相同

时间:2023-07-31 09:12:26浏览次数:47  
标签:文件 字节 READ 最快 BYTES two NET Open byte

转自:.NET CORE下最快比较两个文件内容是否相同的方法 - WAKU - 博客园 (cnblogs.com)

本文因为未考虑磁盘缓存, 结果不是很准确, 更严谨的结果请参看本博文的续集

最近项目有个需求,需要比较两个任意大小文件的内容是否相同,要求如下:

  1. 项目是.NET CORE,所以使用C#进行编写比较方法
  2. 文件大小任意,所以不能将文件内容全部读入到内存中进行比较(更专业点说,需要使用非缓存的比较方式)
  3. 不依赖第三方库
  4. 越快越好

为了选出最优的解决方案,我搭建了一个简单的命令行工程,准备了两个大小为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

相关文章

  • IIS创建网站报错 \\?\C:\Windows\inetsrv\config\applicationHost.config
    ​ ​​编辑​​编辑 现象:IIS创建不了网站,IIS配置没有发生改变 原因:服务器C盘无空间,释放空间后问题解决。​......
  • 001 新建Net Web API工程
    1、新建工程打开VS2022,点击新建项目,弹出创建新项目对话框,然后在项目模板处,选择C#、所有平台以及WebAPI,如下图所示。选择了下面的唯一模板,点击下一步,设置项目的名称、保存路径等。如下图所示。             点击下一步,可使用默认的配置,如下图所示。......
  • nginx搭建文件服务器出现时区问题怎么解决:时间显示错误
    在Nginx搭建文件服务器时,如果出现时区问题,可能会导致文件的修改时间和访问时间显示错误。要解决这个问题,可以按照以下步骤操作:在Nginx配置文件中设置时区。可以在http区块中使用env指令来设置时区,例如:这种方式不行,可能跟nginx版本有关http{#...envTZ=Asia/Shanghai;......
  • CAN转EtherNet/IP网关can协议的特点
    你是否曾经遇到过不同的总线协议难以互相通信的问题?捷米的JM-EIP-CAN网关为你解决了这个烦恼!捷米JM-EIP-CAN通讯网关是一款自主研发的设备,它能够将各种CAN总线和ETHERNET/IP网络连接起来,解决不同总线协议之间的通信障碍。作为ETHERNET/IP总线的从站,它可以连接到CAN总线中,根据节点......
  • 【解惑】介绍.net中的DataTable的AcceptChanges方法
    DataTable.AcceptChanges方法是一个用于DataTable对象的方法,它将所有对DataTable进行的更改标记为已接受。这意味着所有新增、修改和删除的行都将被标记为DataRowState.Unchanged,并且DataTable对象的HasChanges属性将返回false。需要强调的是,AcceptChanges方法只是将更改标记为已......
  • go项目实现在配置文件实现配置项统一管理
    转载请注明出处:go项目中实现配置项统一管理,实现逻辑:将配置项整理为一个json的数据结构,并保存到go.conf文件中,然后在go项目启动main方法中加载go.conf文件,读取go.conf文件的json数据结构,并进行反序列化为go的数据结构,从而在go项目中可以全局使用go.conf文件中的配置项......
  • linux最大文件名长度
    可以通过cat/usr/include/linux/limits.h查看NAME_MAX255 #ifndef_LINUX_LIMITS_H#define_LINUX_LIMITS_H#defineNR_OPEN 1024#defineNGROUPS_MAX65536 /*supplementalgroupIDsareavailable*/#defineARG_MAX131072 /*#bytesofargs......
  • Python - 使用 Matplotlib 可视化在 NetworkX 中生成的图形
    介绍Python代表了一种灵活的编码语言,以其易用性和清晰性而闻名。这提供了许多库和组件,用于简化不同的任务,包括创建图形和显示。NetworkX代表了一个高效的Python工具包,用于构建、更改和研究复杂网络的排列、移动和操作。然而,Matplotlib是一个流行的工具包,用于在Python中创建静......
  • c#传统读取配置文件
    usingMicrosoft.Extensions.Configuration;usingMicrosoft.Extensions.Configuration.Json;namespaceConsoleApp1{internalclassProgram{staticvoidMain(string[]args){//配置系统//jsonxmlini都是支持......
  • java读取txt文件解决乱码问题
    说明:由于txt文件有bom和不同的编码方式,导致导入数据时产生乱码,以下代码完美解决乱码问题。参考他人代码,结合自己的业务加工完成,费了大半天功夫完成,希望对大家有点用处。废话不多说,直接上代码:/***从txt文件流读取数据**@paramtxtStream*@return......