我是把两个word文件存为二进制到数据库,想判断这两个字段是否一致
大家有什么好办法没有,
有说 先判断长度,再逐一判断 ,但我想word文件都是很大,几千维的,这样做循环太多了把?
或者底层是不是有优化啥的,小弟不了解了啊
能否先转换成字符串再比较,也不知道计算机对字符串是怎样比较的,是否也要经过逐位判断?
基础不牢啊,大家帮帮忙,谢谢!
大家有什么好办法没有,
有说 先判断长度,再逐一判断 ,但我想word文件都是很大,几千维的,这样做循环太多了把?
或者底层是不是有优化啥的,小弟不了解了啊
能否先转换成字符串再比较,也不知道计算机对字符串是怎样比较的,是否也要经过逐位判断?
基础不牢啊,大家帮帮忙,谢谢!
10M的2个文件20M数据,硬盘读写速度一般为100Mbit/s,哪怕你处理效率低5Mbyte/s。那也就是几秒读完,因为还要比较,可能时间长一点,也是很快的。注意大文件(不是说超过4G的)最好是分块读取,一次读64K。
这方面我还真没做过~
两个整数异或,如果是相等的,结果一定是0,
因为只要有一个二进制位不同,此位异或就是1,结果肯定大于0
所有的比较结果相与,如果最后结果是0,则整个完全一致~
显然文件比较只能用二进制的直接比较字节流。你转换成其他格式(字符集)都需要时间,转换方法是运行库提供的,有些运行库还会做点你不希望的事情,例如vb6,会把非当前字符集的ascii转换为?,这样你比较就会出错。直接比较就最快了。给你个思路。
2个线程操作。io操作多线程没有意义,但是你可以2个线程。
使用一个互斥体或简化写法lock。一个不停的读文件,读到2个queue中,另一个线程就做对比。就会很快了。
====楼主说是放到数据库,不是随机比较两个文件,在放到数据库的时候建立一个md5索引,比较的时候只要计算一次要比较文件的Md5,这不是更合理?
还是增加两个字段,一个存MD5,一个SHA-1,两个字段同时发生碰撞的概率就极低了
/// <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;
}