python - 在 Python 中获取文件的哈希值(摘要)——一次读取整个文件与逐行读取

标签 python hash md5 digest

我需要用 Python 获取文件的哈希(摘要)。

一般来说,在处理任何文件内容时,由于内存问题,建议逐行逐渐处理,但我需要加载整个文件才能获得其摘要。

目前我是这样获取hash的:

import hashlib

def get_hash(f_path, mode='md5'):
    h = hashlib.new(mode)
    with open(f_path, 'rb') as file:
        data = file.read()
    h.update(data)
    digest = h.hexdigest()
    return digest

有没有其他方法可以以更优化或更简洁的方式执行此操作?

在仍然必须加载整个文件以计算哈希值的情况下,逐行逐行读取文件是否比一次读取整个文件有任何显着改进

最佳答案

根据 hashlib.update() 的文档,您无需担心不同哈希算法的 block 大小。但是,我会测试一下。但是,好像查了一下,512是MD5的 block 大小,如果改成别的,结果和一次读完一样。

import hashlib

def get_hash(f_path, mode='md5'):
    h = hashlib.new(mode)
    with open(f_path, 'rb') as file:
        data = file.read()
    h.update(data)
    digest = h.hexdigest()
    return digest

def get_hash_memory_optimized(f_path, mode='md5'):
    h = hashlib.new(mode)
    with open(f_path, 'rb') as file:
        block = file.read(512)
        while block:
            h.update(block)
            block = file.read(512)

    return h.hexdigest()

digest = get_hash('large_bin_file')
print(digest)

digest = get_hash_memory_optimized('large_bin_file')
print(digest)

> bcf32baa9b05ca3573bf568964f34164
> bcf32baa9b05ca3573bf568964f34164

关于python - 在 Python 中获取文件的哈希值(摘要)——一次读取整个文件与逐行读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42819622/

相关文章:

python - 清除列表和字典的最佳方法

Python 将输入与 boolean 表达式进行比较

function - 有没有温和的哈希函数教程?

python - 以python为引用理解哈希表

mysql md5 select不返回记录

linux - 无法获取 md5 哈希

python - 如何指定 pcolormesh 的轴?

python - OpenCV:在 Python 中从 NumPy 转换为 IplImage

algorithm - 如何计算哈希算法中发生冲突的几率?

python - 如何在不必手动处理数据 block 的情况下散列大文件?