不用MD5和CRC32检验的,要是出了这两个方法没得判断,那么就给我介绍这两种方法的其中一种吧,麻烦你们了

解决方案 »

  1.   

    打开两个文件,一个byte一个byte的比。
      

  2.   

    用MD5是比较好的方法,可以给你写代码。但你必须要参与我的押宝游戏:http://community.csdn.net/Games/GamePawn.aspx?id=409,所押分不得低于100分。用流载入比较字节大小不行,因为两个不同的EXE可能流大小是相同的。比较各个的单个字节可不可行不清楚。
      

  3.   

    用md5和crc32都能作为文件的key.
    我们现在做文件比较就是用的MD5.
    没问题的,网上有MD5的实现代码.很好找.给分,我也可以给你.
      

  4.   

    如果不用MD5和CRC32检验,那就一个个字节比较吧,那样肯定准确
      

  5.   

    HASH没有逐字节比较快。
    因为HASH必须把整个文件读一遍才能得到HASH值,而逐字节比较可能只做一小部分就不用再比了,最坏情况时与HASH相同,需要遍历整个文件,但是只是进行两个字节的比较,不需要进行HASH计算,效率还是比HASH稍高。
      

  6.   


    你所说的用HASH值的主要目的是为了防止文件被非正常修改。
    两个文件的对较,还是逐字节对比好。
      

  7.   

    算hash值并不一定需要一次性读取整个文件
      

  8.   

    和你们PM说说,用MD5或者CRC32好了,Hash也不错至于逐个字节比对一下行,肯定是行的,就是速度可能会慢点
    不过某位仁兄说,随机取一块来比较看,这种对付区别大的文件效率会比较好点,但是若2个文件相差很小,
    那失误率可能会蛮高的
    那先看文件大小,等等,可以优先作为粗略比对文件异同的方法,应该会有效的。
      

  9.   

    如果只要比较异同,用FC命令就可以实现。[code=BatchFile]比较两个文件或两个文件集并显示它们之间的不同
    FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]] [/T] [/U] [/W] [/nnnn]
       [drive1:][path1]filename1 [drive2:][path2]filename2
    FC /B [drive1:][path1]filename1 [drive2:][path2]filename2  /A         只显示每个不同处的第一行和最后一行。
      /B         执行二进制比较。
      /C         不分大小写。
      /L         将文件作为 ASCII 文字比较。
      /LBn       将连续不匹配的最大值设为指定的行数。
      /N         在 ASCII 比较上显示行数。
      /OFF[LINE] 不要跳过带有脱机属性集的文件。
      /T         不要将 tab 扩充到空格。
      /U         将文件作为 UNICODE 文字文件比较。
      /W         为了比较而压缩空白(tab 和空格)。
      /nnnn      指定不匹配处后必须连续匹配的行数。
      [drive1:][path1]filename1
                 指定要比较的第一个文件或第一个文件集。
      [drive2:][path2]filename2
                 指定要比较的第二个文件或第二个文件集。[/code]如果编程实现,先比较长度,然后逐字节比较。如果要记录文件特征,就用MD5、CRC了。
      

  10.   

    不遍历整个文件内容的HASH,是不能精确对比出两个文件的不同的。
    即使遍历整文件内容的HASH,也有可能出现两个不同文件的HASH值是相同的“碰撞”的。所以,要精确对比两个文件是否相同,还是得逐字节对比。
      

  11.   

    如果是简单判断是否相同的话,先比大小再比较md5或者逐byte比较都可以
    如果还想知道哪不同的话,看看lcs算法(longest common substring)
      

  12.   

    最快的是先比大小,大小相同再成块读取出来用memcmp来逐块进行比较。
    如果两个文件分别在网络的两端,不方便直接比较才需要考虑每一端用一个MD5或CRC32算法来各自根据文件内容产生一个校验码,比较校验码是否相同来决定文件内容是否相同。
      

  13.   

    先看文件大小,不同的文件有一样的大小很巧合,要是文件不同,多半一比大小就知道了。
    要是大小一样的话,再一个byte一个byte的比。仅仅是判断是否相同就不要用MD5或者其它算法了,因为那些算法同样要读出每一个byte,还要浪费额外的计算时间。
      

  14.   

    LZ的表述不够清楚啊,要看是在什么场合下,有什么限制。
    如果文件巨大,或者传输缓慢,或者读取速度有限,那么就不能逐字节来比较;如果处理性能受限制,那么就不能选用过于复杂的HASH算法;
    “简单判断两个文件是否不同”,如果光从这一句来说,那么我可以很负责任的解答:“逐字节比较”。很简单,并且结果绝对正确。
      

  15.   

    用fc比较吧:fc 第一个文件 第二个文件.
      

  16.   

    用ultracomp pro 版去比较……
    这个方法或许比较靠谱,借助第三方的软件!
      

  17.   

    用MD5作hash应该是比较好的方法,说实话,我不太认可逐字节比,因为一般这种问题要比的往往不只是2个文件,
    比得文件越多,hash的优势越明显。另外要想提高效率,最好还是先比一下文件的大小。用md5也可以考虑分段比,
    比如每100K一段,发现了不同,视策略而定,看是否要继续比下去。
      

  18.   

    看文件大小吧。CRC也是一种方法。
      

  19.   

    首先是大小比较,不一样就"一票否决"; 然后就是各字节依次往后比.至于 MD5, 个人一直有一个事情没想通: 固定数目字节只能表示固定数目的不同状态, MD5 却想着无论多大或才多小的数据都转换成一个固定长度的序列,这怎么可能?! 
      

  20.   

    这只是文件流中的一个内容,用二进投制就行了.(当然这两个文件自然就是二进制文件,我给是TXT文件)
    代码:
     class Program
        {
            //对比两文件的方法
            public bool CompareFile(string a,string b)
            {
                FileStream fsa = new FileStream(a, FileMode.Open);
                FileStream fsb= new FileStream(b, FileMode.Open);
                byte[] buffa = new byte[1];
                byte[] buffb= new byte[1];
                int bytesread;
                bool flag=false ;            if (a.Length != b.Length)//文件长度不同
                {
                    flag =false ;
                    fsa.Close ();
                    fsb.Close ();
                    return flag;
                }
                else
                {
                    while (( bytesread = fsa.Read(buffa, 0, 1) ) > 0)
                    {
                        bytesread = fsb.Read(buffb, 0, 1);
                        if (buffa[0] != buffb[0])//内容不同
                        {
                            flag = false;
                        }
                        else
                        {
                            flag = true;
                        }                        
                    }
                    fsa.Close();
                    fsb.Close();
                    return flag;
                }
            }        static void Main(string[] args)
            {
                Program test = new Program();
                bool result=test.CompareFile("c:\\a.txt","c:\\b.txt");
                if (result)
                    Console.Write("这两个文件内容相同");
                else
                    Console.Write("这两个文件内容不相同");
                Console.ReadKey();
                
            }
        }
      

  21.   

    摘要算法的碰撞(包括MD5碰撞,CRC32碰撞)天然状态下极难出现,几率几乎为0,但如果人工制造碰撞,则很容易找到碰撞,已经有人开发出了寻找碰撞的小程序,几秒钟就能算出一个MD5碰撞。
      

  22.   

    你们说用hash要快一点,我感到有点不解?计算两个内存块的hash应该要比比较两个内存块的速度慢吧。计算hash要好多个指令的,但是比较内存的指令却很简单。
    这里说的只是比较两个文件,而不是一个文件与多个文件进行比较,所以我觉得,用计算hash然后再进行比较有点不够直接,而且也达不到比直接比较更快的期望。
      

  23.   

    无论简单复杂,最后还是要一比大小,二比内容
    MD5与CRC都是指纹码,所以用于多个文件同时比较,毕竟一个个文件来比,有多少个文件,就要比多少次才能知道是否有不相同的文件.
    而只有两个文件的话,当然是逐一对比,没的说的,FC也是一样的,只是不用delphi罢了.
      

  24.   

    难道没有人看出LZ的条件不明确吗?如果是本地文件进行对比,当然是逐字节/块进行对比最好。
    如果是需要在网络中进行,考虑到逐字节比较需要在网络里传递整个文件。所以退而求次用hash算法计算出来,然后在网络中传递这个hash串进行对比。
    如果是两个文件比较,逐字节也是最好的。
    如果是多个文件互相比较,考虑到一个文件要被用来做超过1次以上的对比,所以可以考虑用hash算法计算出来之后,缓存结果以便第二次时候对比。这种问题有啥好讨论的,根据需求而定即可。
      

  25.   

    当然是逐个字节比较了。无论crc还是md5,都是要读取每一个字节然后计算的,绕远路了。