2015-05-27 4 views
1

Я пишу скрипт python, который должен искать все файлы с тем же содержимым в cwd. Моя идея - использовать хэш-функции, но когда я запускаю скрипт, каждый файл получает другой дайджест, даже если он является копиями, чего не происходит, если я их вычисляю на терминале. Я просто не могу понять, где проблема. Вот кодХеширование файлов с помощью python

import sys 
import os 
import hashlib 
from collections import defaultdict 

blocksize = 65536 

def hashfile(file, hasher): 
    buf = file.read(blocksize) 
    while len(buf)>0: 
     hasher.update(buf) 
     buf = file.read(blocksize) 
    #print hasher.hexdigest() 
    return hasher.hexdigest() 

def main(): 
    dir = os.getcwd() 
    files = os.listdir(dir) 
    dict = defaultdict(list) 
    l = [] 
    hasher = hashlib.sha256() 

    for file in files: 
     hash = hashfile(open(file, 'rb'), hasher) 
     l.append((hash, file)) 

    for k, v in l: 
     dict[k].append(v) 

    for k in dict.items(): 
     print k 


if __name__ == '__main__': 
    main() 

ответ

0

Вы используете один hasher для всех файлов, и это будет обновление накопительно. Когда вы имеете дело со вторым файлом, вы получаете дайджест первого и второго файлов.

#hasher = hashlib.sha256() 

    for file in files: 
     hasher = hashlib.sha256() 
     hash = hashfile(open(file, 'rb'), hasher) 
     l.append((hash, file)) 

Переместить линию hasher = hashlib.sha256() в цикл for.

Я думаю, что лучше двигаться hasher = hashlib.sha256() функции hashfile:

def hashfile(file): 
    hasher = hashlib.sha256() 
    buf = file.read(blocksize) 
    #original code here 

Это сделает код более понятным.

Смежные вопросы