有没有一种快速的方法可以在python中对大量文件进行指纹识别?

有没有一种快速的方法可以在python中对大量文件进行指纹识别?,python,hash,Python,Hash,我正在编写一个程序,该程序有一个比较文件指纹的函数(对于文件,删除hash\u方法.update(buf)?如果将hash=fingerprinter(file\u base)更改为hash='foobar',需要多长时间?(1)好的,所以我运行了几次测试(包括原始测试,只是为了比较).奇怪的是,最初几次运行速度非常慢,但最后几次运行速度非常快(我不得不继续运行,因为我修改了输出数据并确保它收集了正确的数据)。我不知道为什么会这样,但这两次都有效。至于结果:原始代码:8.75s。您的更改:0.6

我正在编写一个程序,该程序有一个比较文件指纹的函数(对于文件,删除
hash\u方法.update(buf)
?如果将
hash=fingerprinter(file\u base)
更改为
hash='foobar'
,需要多长时间?(1)好的,所以我运行了几次测试(包括原始测试,只是为了比较).奇怪的是,最初几次运行速度非常慢,但最后几次运行速度非常快(我不得不继续运行,因为我修改了输出数据并确保它收集了正确的数据)。我不知道为什么会这样,但这两次都有效。至于结果:原始代码:8.75s。您的更改:0.692秒。我想知道这是否是因为我在这些时间关闭了firefox?无论如何,这样做要快得多,谢谢。(2)我正在检查“指纹识别器”的基准(使用snakeviz)方法。其余的代码只会增加约3秒的开销。有一些方法可以监视文件系统中的文件更改,我认为这些更改不会占用太多处理器。您能说得更具体一些吗?我考虑过创建一个缓存,但我没有这方面的经验。根据我收集的信息,如果我在后台运行一个进程,我可以检测更改(缓存将更新),但我不想在后台运行。或者,如果我做了类似于为目录保存哈希的操作,它将不会是特定的。我还希望代码的占用空间尽可能小(不要创建大量文件或一个过长的冗余文件)。我的假设是否完全偏离了基准?删除
hash\u方法需要多长时间。更新(buf)
?如果将
hash=fingerprinter(file\u base)
更改为
hash='foobar'
,需要多长时间?(1)好的,所以我运行了几次测试(包括原始测试,只是为了比较).奇怪的是,最初几次运行速度非常慢,但最后几次运行速度非常快(我不得不继续运行,因为我修改了输出数据并确保它收集了正确的数据)。我不知道为什么会这样,但这两次都有效。至于结果:原始代码:8.75s。您的更改:0.692秒。我想知道这是否是因为我在这些时间关闭了firefox?无论如何,这样做要快得多,谢谢。(2)我正在检查“指纹识别器”的基准(使用snakeviz)方法。其余的代码只会增加约3秒的开销。有一些方法可以监视文件系统中的文件更改,我认为这些更改不会占用太多处理器。您能说得更具体一些吗?我考虑过创建一个缓存,但我没有这方面的经验。根据我收集的信息,如果我在后台运行一个进程,我可以检测更改(缓存将更新),但我不想在后台运行。或者,如果我做了类似于为目录保存哈希的操作,它不会是特定的。我还希望代码的占用空间尽可能小(不要创建很多文件或一个过长的冗余文件)。我的假设是否完全不正确?
from hashlib import md5

BLOCK_SIZE = 65536

def fingerprinter(file_path):
    hash_method = md5()
    with open(file_path, 'rb') as input_file:
        buf = input_file.read(BLOCK_SIZE)
        while len(buf) > 0:
            hash_method.update(buf)
            buf = input_file.read(BLOCK_SIZE)

    return hash_method.hexdigest()
def query(x_path):
    directory_tree = {}
    for root, dirs, files in os.walk(x_path, topdown=True):
        for name in files:
            if not "/." in root and not name.startswith("."):
                file_base = os.path.join(root, name) ## Root = path | Name = file
                print(file_base)
                hash = fingerprinter(file_base)
                media[file_base.split("/")[-1]] = {"hash": hash}

    return directory_tree