gpt4 book ai didi

python - Python 中的文件校验和

转载 作者:太空狗 更新时间:2023-10-30 02:04:51 25 4
gpt4 key购买 nike

我正在创建一个与文件相关的应用程序。我一直在寻找计算文件校验和的方法。我想知道根据此标准计算文件 md5 或 SHA-1 或其他内容的校验和的最佳哈希方法是什么

  • 校验和应该是唯一的。我知道这是理论上的,但我仍然希望碰撞的概率非常非常小。
  • 可以比较两个文件的校验和是否相等。
  • 速度(不是很重要,但仍然)

请尽可能详尽。

最佳答案

这取决于您的用例。

如果您只担心意外碰撞,MD5 和 SHA-1 都可以,而且 MD5 通常更快。事实上,MD4 对于大多数用例也足够了,而且通常更快……但它并没有被广泛实现。 (特别是,它不在 hashlib.algorithms_guaranteed 中……尽管在大多数 Mac、Windows 和 Linux 版本上它应该在 hashlib_algorithms_available 中。)

另一方面,如果您担心蓄意攻击——即有人故意制作与您的散列匹配的虚假文件——您必须考虑您所保护内容的值(value)。 MD4 几乎肯定是不够的,MD5 可能还不够,但 SHA-1 是临界值。目前,Keccak(很快将通过 SHA-3)被认为是最好的选择,但您需要掌握它,因为情况每年都在变化。

Cryptographic hash function 上的维基百科页面有一个通常更新很频繁的表。要理解表格:

生成与 MD4 的碰撞只需要 3 轮,而 MD5 需要大约 200 万次,而 SHA-1 需要 15 万亿次。这足以产生碰撞将花费几百万美元(按今天的价格计算)。这对您来说可能不够好,也可能不够好,但对 NIST 来说还不够好。


另外,请记住“总体上更快”远不如“在我的数据和平台上测试得更快”那么重要。考虑到这一点,在我的 Mac 上的 64 位 Python 3.3.0 中,我创建了一个 1MB 的随机 bytes 对象,然后这样做:

In [173]: md4 = hashlib.new('md4')
In [174]: md5 = hashlib.new('md5')
In [175]: sha1 = hashlib.new('sha1')
In [180]: %timeit md4.update(data)
1000 loops, best of 3: 1.54 ms per loop
In [181]: %timeit md5.update(data)
100 loops, best of 3: 2.52 ms per loop
In [182]: %timeit sha1.update(data)
100 loops, best of 3: 2.94 ms per loop

如您所见,md4 比其他的快得多。

测试使用 hashlib.md5() 而不是 hashlib.new('md5'),并使用熵较小的 bytes(运行由空格分隔的 1-8 个 string.ascii_letters)没有显示出任何显着差异。

而且,对于我安装的散列算法,正如下面所测试的,没有什么比 md4 更好的了。

for x in hashlib.algorithms_available:
h = hashlib.new(x)
print(x, timeit.timeit(lambda: h.update(data), number=100))

如果速度真的很重要,可以使用一个很好的技巧来改进它:使用一个糟糕但非常快的哈希函数,比如 zlib.adler32,并且只将它应用于每个文件的前 256KB。 (对于某些文件类型,最后的 256KB,或最接近中间的 256KB 等可能比第一个更好。)然后,如果发现冲突,则生成 MD4/SHA-1/Keccak/whatever hashes on每个文件的整个文件。


最后,由于有人在评论中询问如何在不将整个文件读入内存的情况下对文件进行哈希处理:

def hash_file(path, algorithm='md5', bufsize=8192):
h = hashlib.new(algorithm)
with open(path, 'rb') as f:
block = f.read(bufsize)
if not block:
break
h.update(block)
return h.digest()

如果充分发挥性能很重要,您将需要在您的平台上尝试不同的 bufsize 值(从 4KB 到 8MB 的 2 的幂)。您可能还想尝试使用原始文件句柄(os.openos.read),这有时在某些平台上可能更快。

关于python - Python 中的文件校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16799088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com