我是把两个word文件存为二进制到数据库,想判断这两个字段是否一致
大家有什么好办法没有,
有说 先判断长度,再逐一判断 ,但我想word文件都是很大,几千维的,这样做循环太多了把?
或者底层是不是有优化啥的,小弟不了解了啊
能否先转换成字符串再比较,也不知道计算机对字符串是怎样比较的,是否也要经过逐位判断?
基础不牢啊,大家帮帮忙,谢谢!

解决方案 »

  1.   

    32位int型二进制与操作比较最快,用指针移动不用unsafe代码的话,就逐字节比较咯~
      

  2.   

    逐个判断也不慢的。
    10M的2个文件20M数据,硬盘读写速度一般为100Mbit/s,哪怕你处理效率低5Mbyte/s。那也就是几秒读完,因为还要比较,可能时间长一点,也是很快的。注意大文件(不是说超过4G的)最好是分块读取,一次读64K。
      

  3.   

    sorry,比较应该是按位异或吧,相与是不对的
    这方面我还真没做过~
      

  4.   

    你是想不保存重复的文件吧?在保存的时候做个散列,就是生成一个MD5或者SHA值,比较就直接比较这个值就可以了
      

  5.   

    用int指针,每次比较4个字节,效率高些
    两个整数异或,如果是相等的,结果一定是0,
    因为只要有一个二进制位不同,此位异或就是1,结果肯定大于0
    所有的比较结果相与,如果最后结果是0,则整个完全一致~
      

  6.   

    我还是觉得应该做MD5等操作,否则每次比较都打开大文件,频繁比较的话有的麻烦了,加个字段,保存MD5,输入的时候做一次MD5就可以了,比较速度要多块有多块
      

  7.   


    显然文件比较只能用二进制的直接比较字节流。你转换成其他格式(字符集)都需要时间,转换方法是运行库提供的,有些运行库还会做点你不希望的事情,例如vb6,会把非当前字符集的ascii转换为?,这样你比较就会出错。直接比较就最快了。给你个思路。
    2个线程操作。io操作多线程没有意义,但是你可以2个线程。
    使用一个互斥体或简化写法lock。一个不停的读文件,读到2个queue中,另一个线程就做对比。就会很快了。
      

  8.   

    因为你的两个WORD要存储到数据库,所以在存储前可以对文件MD5,这样在比较文件是否相等的时候直接比较MD5值就可以吧
      

  9.   

    就直接每个字节异或比较,为0跳出就最快了。要是觉得那样不好理解,就用MD5引擎Hash一下,得到他们各自的MD5码后比较是否相同即可,不过我感觉效率没有直接字节比较的高。
      

  10.   

    说md5效率低的人可能没明白,MD5可以先保存在一个字段的,这样只要做一次md5就可以了,效率比每次都去二进制比较是要高的多的
      

  11.   

    md5效率不低,你弄错了。md5不过是获取的散列值,你如何获取?用文件的尺寸?还是文件内容?所以为了获得这个md5。你一样要读取整个文件来生成文件对应的md5,没错。如果你有配置吧文件的md5记下来,那最好了。相当于建立索引了。显然楼主是随机的选择2个文件,之前没有索引的。计算md5不慢,但是你为了md5还要读取整个文件,有这功夫,直接对比都结束了。
      

  12.   

    我是把两个word文件存为二进制到数据库
    ====楼主说是放到数据库,不是随机比较两个文件,在放到数据库的时候建立一个md5索引,比较的时候只要计算一次要比较文件的Md5,这不是更合理?
      

  13.   

    MD5的碰撞率较高,如果是合同等安全性要求较高的文件
    还是增加两个字段,一个存MD5,一个SHA-1,两个字段同时发生碰撞的概率就极低了
      

  14.   

    扩展一个hash字段,查询的时候把hash条件优先,基本就解决了。
      

  15.   


        /// <summary>
        /// 比较两个字节数组是否相等
         /// </summary>
        /// <param name="b1">byte数组1</param>
        /// <param name="b2">byte数组2</param>
        /// <returns>是否相等</returns>
        private bool PasswordEquals(byte[] b1, byte[] b2)
        {
            if (b1 == null || b2 == null) 
                return false;
            if (b1.Length != b2.Length) 
                return false;        
            for (int i = 0; i < b1.Length; i++)
                if (b1[i] != b2[i])
                    return false;
            return true;
        }