如何在Python中创建文件的校验和

问题描述 投票:0回答:3

我正在尝试创建文件的校验和并将校验和保存为相同的文件。因此,我监视文件,如果校验和发生变化,则执行某些操作。

这是校验和

对于测试.txt

contents: a
checksum: dd18bf3a8e0a2a3e53e2661c7fb53534

我编辑文件:

contents: aa
checksum: dd18bf3a8e0a2a3e53e2661c7fb53534

这是我的代码:

python -c 'import hashlib;print hashlib.md5("test.txt").hexdigest()'

为什么校验和相同?

python checksum
3个回答
6
投票

为什么校验和相同?

因为您正在计算相同内容的哈希值

test.txt

这是一个通用工具(广泛使用的

md5sum
CLI 工具的克隆,可在许多 Linux 和 UNIX 平台上使用),可以很好地扩展大文件。

md5sum.py:

#!/usr/bin/env python

"""Tool to compuete md5 sums of files"""

import sys
from hashlib import md5


def md5sum(filename):
    hash = md5()
    with open(filename, "rb") as f:
        for chunk in iter(lambda: f.read(128 * hash.block_size), b""):
            hash.update(chunk)
    return hash.hexdigest()


def main():
    if len(sys.argv) < 2:
        print "Usage: md5sum <filename>"
        raise SystemExit(1)

    print md5sum(sys.argv[1])


if __name__ == "__main__":
    main()

大量借用:https://bitbucket.org/prologic/tools/src/tip/md5sum


2
投票

您可以尝试检查hashlib.md5()

import hashlib
[(fname, hashlib.md5(open(fname, 'rb').read()).digest()) for fname in fnamelst]

0
投票

hashlib 中的核心哈希函数接受要哈希的字符串内容,而不是要打开和读取的文件名,因此正如 James 所说,在这两种情况下,您都会哈希相同的值

'text.txt'

James 的答案以一种防弹且可移植的方式解决了这个问题,但如果您只针对 Python 3.11+,则可以使用一个新选项:

hashlib.file_digest()
。它需要一个文件对象和一个哈希函数或 hashlib 哈希函数的名称。与您尝试的等效内容如下:

import hashlib
with open('text.txt', 'rb') as file:
    print(hashlib.file_digest(file, 'md5').hexdigest())
© www.soinside.com 2019 - 2024. All rights reserved.