Windows和Linux中的Hashlib
我正在用Python写一个点对点的应用程序,想用hashlib模块来识别网络中内容相同但名字不同的文件。
问题是,我在Windows(Vista)上测试了计算文件哈希值的代码,速度非常快(几GB的文件不到一秒)。但是在Linux(Fedora 12,使用自己编译的Python 2.6.2和2.7.1,因为我没找到合适的rpm包)上就慢得多,处理不到1GB的文件几乎要花一分钟。
我想知道,为什么会这样?还有我能做些什么来提高Linux上的性能吗?
计算哈希值的代码是
import hashlib
...
def crear_lista(directorio):
lista = open(archivo, "w")
for (root, dirs, files) in os.walk(directorio):
for f in files:
#archivo para hacerle el hash
h = open(os.path.join(root, f), "r")
#calcular el hash de los archivos
md5 = hashlib.md5()
while True:
trozo = h.read(md5.block_size)
if not trozo: break
md5.update(trozo)
#cada linea es el nombre de archivo y su hash
size = str(os.path.getsize(os.path.join(root, f)) / 1024)
digest = md5.hexdigest()
#primera linea: nombre del archivo
#segunda: tamaño en KBs
#tercera: hash
lines = f + "\n" + size + "\n" + digest + "\n"
lista.write(lines)
del md5
h.close()
lista.close()
我把 r
改成了 rb
和 rU
,但结果还是一样。
1 个回答
3
你正在以64字节(hashlib.md5().block_size
)为单位读取文件并进行哈希处理。
你应该使用更大的读取值,范围在256KB(262144字节)到4MB(4194304字节)之间,然后再进行哈希处理;这个digup程序就是以1MB为单位读取的,具体代码如下:
block_size = 1048576 # 1MB
while True:
trozo = h.read(block_size)
if not trozo: break
md5.update(trozo)