当前位置:编程学习 > C#/ASP.NET >>

两个byte[]比较问题

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

不用unsafe代码的话,就逐字节比较咯~ --------------------编程问答-------------------- 还是要逐个判断的。 --------------------编程问答-------------------- 二进制与操作,结果累此相与,最后再判断 --------------------编程问答-------------------- 逐个判断也不慢的。
10M的2个文件20M数据,硬盘读写速度一般为100Mbit/s,哪怕你处理效率低5Mbyte/s。那也就是几秒读完,因为还要比较,可能时间长一点,也是很快的。注意大文件(不是说超过4G的)最好是分块读取,一次读64K。 --------------------编程问答-------------------- sorry,比较应该是按位异或吧,相与是不对的
这方面我还真没做过~ --------------------编程问答-------------------- 按位异或?
楼上大哥能否说清楚些呢? --------------------编程问答--------------------
引用 7 楼 wz2zf 的回复:
按位异或?
楼上大哥能否说清楚些呢?


哪里不清楚了呢?
不知道异或还是不知道^运算符?
基础最好打扎实了再来写程序~ --------------------编程问答-------------------- 你是想不保存重复的文件吧?在保存的时候做个散列,就是生成一个MD5或者SHA值,比较就直接比较这个值就可以了 --------------------编程问答-------------------- 用int指针,每次比较4个字节,效率高些
两个整数异或,如果是相等的,结果一定是0,
因为只要有一个二进制位不同,此位异或就是1,结果肯定大于0
所有的比较结果相与,如果最后结果是0,则整个完全一致~ --------------------编程问答-------------------- 异或知道,就为了比较而再进行次异或?不知您的思路是怎样的? --------------------编程问答-------------------- 学习了,帮顶!! --------------------编程问答-------------------- 嗯,也不用拘泥于二进制比较,只要能满足比较两个文件是否一致就行
--------------------编程问答-------------------- 我还是觉得应该做MD5等操作,否则每次比较都打开大文件,频繁比较的话有的麻烦了,加个字段,保存MD5,输入的时候做一次MD5就可以了,比较速度要多块有多块 --------------------编程问答-------------------- 本来逐字节比较的话只要不同就可以跳出的,
那 异或位 与字节比较,哪个更快些? --------------------编程问答-------------------- 学习了,帮顶。。。 --------------------编程问答--------------------
引用 13 楼 wz2zf 的回复:
嗯,也不用拘泥于二进制比较,只要能满足比较两个文件是否一致就行


显然文件比较只能用二进制的直接比较字节流。你转换成其他格式(字符集)都需要时间,转换方法是运行库提供的,有些运行库还会做点你不希望的事情,例如vb6,会把非当前字符集的ascii转换为?,这样你比较就会出错。

直接比较就最快了。给你个思路。
2个线程操作。io操作多线程没有意义,但是你可以2个线程。
使用一个互斥体或简化写法lock。一个不停的读文件,读到2个queue中,另一个线程就做对比。就会很快了。 --------------------编程问答-------------------- 为什么不用md5取到摘要后在比较摘要? --------------------编程问答-------------------- 我觉得我说的很清楚了 --------------------编程问答--------------------
引用 18 楼 tmxk2002 的回复:
为什么不用md5取到摘要后在比较摘要?


你的md5如何计算的,还不是要根据文件的每个字节来算。 --------------------编程问答-------------------- 楼主不是要效率吗,整个文件md5是要花不少时间的 --------------------编程问答--------------------
引用 15 楼 wz2zf 的回复:
本来逐字节比较的话只要不同就可以跳出的,
那 异或位 与字节比较,哪个更快些?


二进制位运算,是计算机里最快的操作,比加减快得多,乘除或者更复杂的步骤就更不用说了
看来你不是学计算机出身的~ --------------------编程问答-------------------- 路过一下 --------------------编程问答-------------------- 我从来没说不可以中间跳出
比如每64K的相与结果判断下,如果不为0,就直接跳出了 --------------------编程问答-------------------- 因为你的两个WORD要存储到数据库,所以在存储前可以对文件MD5,这样在比较文件是否相等的时候直接比较MD5值就可以吧
--------------------编程问答-------------------- 呵呵,小弟是学计算机的
唉,汗死我了 --------------------编程问答-------------------- 就直接每个字节异或比较,为0跳出就最快了。要是觉得那样不好理解,就用MD5引擎Hash一下,得到他们各自的MD5码后比较是否相同即可,不过我感觉效率没有直接字节比较的高。 --------------------编程问答-------------------- 看能否把学校学的算法知识用上,比如:快速排序方式从里面读取数据,先定义好固定长度,取出固定长度进行比较,然后执行自己的操作吧。
呵呵,当成建议吧
--------------------编程问答-------------------- 说md5效率低的人可能没明白,MD5可以先保存在一个字段的,这样只要做一次md5就可以了,效率比每次都去二进制比较是要高的多的 --------------------编程问答--------------------
引用 29 楼 hztltgg 的回复:
说md5效率低的人可能没明白,MD5可以先保存在一个字段的,这样只要做一次md5就可以了,效率比每次都去二进制比较是要高的多的

md5效率不低,你弄错了。md5不过是获取的散列值,你如何获取?用文件的尺寸?还是文件内容?所以为了获得这个md5。你一样要读取整个文件来生成文件对应的md5,没错。如果你有配置吧文件的md5记下来,那最好了。相当于建立索引了。显然楼主是随机的选择2个文件,之前没有索引的。计算md5不慢,但是你为了md5还要读取整个文件,有这功夫,直接对比都结束了。 --------------------编程问答-------------------- 我感觉效率MD5没有直接字节比较的高 --------------------编程问答-------------------- 我是把两个word文件存为二进制到数据库
====

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

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


没看仔细哈。数据库,那可以。可以。增加一个字段记录md5。 --------------------编程问答-------------------- MD5的碰撞率较高,如果是合同等安全性要求较高的文件
还是增加两个字段,一个存MD5,一个SHA-1,两个字段同时发生碰撞的概率就极低了 --------------------编程问答-------------------- 扩展一个hash字段,查询的时候把hash条件优先,基本就解决了。 --------------------编程问答--------------------
引用 35 楼 sbwwkmyd 的回复:
扩展一个hash字段,查询的时候把hash条件优先,基本就解决了。

hash字段要建索引 --------------------编程问答-------------------- up... --------------------编程问答-------------------- 通过客户端判断先搞定再说,此话题还将有待验证,非常感谢大家! --------------------编程问答--------------------

    /// <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;
    }
--------------------编程问答-------------------- --------------------编程问答-------------------- 只比较文件创建时间和名字 改了就是改了没改就是没改。 --------------------编程问答-------------------- 用MD5加密后判断
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,