使用python散列文件

时间:2015-05-27 09:53:13

标签: python hash

我正在编写一个python脚本,它应该在cwd中查找具有相同内容的所有文件。我的想法是使用哈希函数,但是当我运行脚本时,每个文件都会获得不同的摘要,即使它们是副本,如果我在终端上计算它们也不会发生。我只是无法弄清楚问题出在哪里。这是代码

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()

1 个答案:

答案 0 :(得分: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

它会使代码更清晰。