You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3中如何为exiftool提取的二进制JPG计算SHA512校验和?

如何为Exiftool提取的二进制JPG计算SHA512校验和?

其实你有两种可行的方案,其中纯Python内处理的方式更简洁,还不用依赖额外的系统命令,算是更优的选择,我先给你详细说这个:

方案一:纯Python计算SHA512(推荐)

你可以直接用Python标准库中的hashlib来处理提取到的二进制数据,不用把数据写到临时文件或者管道给外部命令。修改你的函数就行:

import subprocess
import hashlib

def getVisSig(filename):
    """ Calculates visual signature using imagemagick package. returns signature """
    print("Calculating VisSig on %s" % filename)
    # 启动exiftool提取二进制预览图
    result = subprocess.Popen(["exiftool","-b","-PreviewImage", filename,], stdout=subprocess.PIPE)
    # 获取输出的二进制数据
    binary_data, _ = result.communicate()
    
    # 计算SHA512校验和
    sha512_hash = hashlib.sha512()
    sha512_hash.update(binary_data)
    # 返回十六进制格式的校验和
    return sha512_hash.hexdigest()

这里的关键是用communicate()获取subprocess输出的二进制内容,然后直接喂给hashlib的SHA512对象。这种方式完全在Python环境内完成,跨平台性更好,也避免了管道可能带来的额外开销。

方案二:通过命令行管道传输到sha512sum

如果你还是想用一开始考虑的管道方式,也可以实现,直接在subprocess里构造管道命令就行:

import subprocess

def getVisSig(filename):
    """ Calculates visual signature using imagemagick package. returns signature """
    print("Calculating VisSig on %s" % filename)
    # 构造管道:exiftool输出直接传给sha512sum
    exif_proc = subprocess.Popen(["exiftool","-b","-PreviewImage", filename], stdout=subprocess.PIPE)
    sha_proc = subprocess.Popen(["sha512sum"], stdin=exif_proc.stdout, stdout=subprocess.PIPE)
    # 关闭exif_proc的stdout,让它收到SIGPIPE当sha_proc结束时
    exif_proc.stdout.close()
    # 获取sha512sum的输出
    output, _ = sha_proc.communicate()
    # 输出格式是"校验和  -",所以取前面的部分
    return output.decode('utf-8').split()[0]

不过这种方式依赖系统上安装了sha512sum命令(Windows上可能没有,需要额外配置),所以通用性不如纯Python的方案。

内容的提问来源于stack exchange,提问作者ensnare

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:27:08