2009-07-02 66 views

回答

54

是的,我认为散列文件将是最好的方法,如果你必须比较几个文件和存储散列值以供以后比较。由于散列可能会发生冲突,因此根据使用情况可能会进行逐字节的比较。

通常逐个字节的比较是足够高效的,filecmp模块已经做了其他事情。

请参阅http://docs.python.org/library/filecmp.html 例如,

>>> import filecmp 
>>> filecmp.cmp('file1.txt', 'file1.txt') 
True 
>>> filecmp.cmp('file1.txt', 'file2.txt') 
False 

速度的考虑: 通常,如果只有两个文件都进行比较,哈希他们,如果比较高效地完成起来会更慢,而不是简单的逐字节的比较。例如下面的代码尝试时间散列vs逐字节

声明:这不是计时或比较两个算法的最佳方式。并且需要改进,但它确实给出了粗略的想法。如果你认为应该改进,请告诉我,我会改变它。

import random 
import string 
import hashlib 
import time 

def getRandText(N): 
    return "".join([random.choice(string.printable) for i in xrange(N)]) 

N=1000000 
randText1 = getRandText(N) 
randText2 = getRandText(N) 

def cmpHash(text1, text2): 
    hash1 = hashlib.md5() 
    hash1.update(text1) 
    hash1 = hash1.hexdigest() 

    hash2 = hashlib.md5() 
    hash2.update(text2) 
    hash2 = hash2.hexdigest() 

    return hash1 == hash2 

def cmpByteByByte(text1, text2): 
    return text1 == text2 

for cmpFunc in (cmpHash, cmpByteByByte): 
    st = time.time() 
    for i in range(10): 
     cmpFunc(randText1, randText2) 
    print cmpFunc.func_name,time.time()-st 

和输出

cmpHash 0.234999895096 
cmpByteByByte 0.0 
+10

没理由当一个简单的逐字节比较工作时,做一个昂贵的散列。 +1 for filecmp – 2009-07-02 04:58:53

3

我不知道,如果你想查找重复文件或只是比较两个单个文件。如果后者,上述方法(filecmp)更好,如果前者,下面的方法更好。

这里有很多重复文件检测问题。假设他们不是非常小,性能是重要的,你可以

  • 比较文件大小首先,丢弃所有如果文件大小匹配不匹配
  • ,比较使用可以处理最大的散列,散列文件的块,以避免读取整个大文件

这里是Python implementations一个答案(我更喜欢一个由nosklo,BTW)