这种“快速哈希”功能是危险的吗?

时间:2014-06-24 14:42:23

标签: python hash

我需要一个智能复制功能,以实现可靠,快速的文件复制。链接。文件非常大(从几千兆字节到超过200GB)并分布在很多文件夹中,人们在白天重命名文件和文件夹,所以我想使用哈希来查看我是否已经复制了文件,也许是以不同的名称,只在这种情况下创建一个链接。

我对哈希完全不熟悉,我在这里使用此函数哈希:

import hashlib

def calculate_sha256(cls, file_path, chunk_size=2 ** 10):
    '''
    Calculate the Sha256 for a given file.

    @param file_path: The file_path including the file name.
    @param chunk_size: The chunk size to allow reading of large files.
    @return Sha256 sum for the given file.
    '''
    sha256 = hashlib.sha256()
    with open(file_path, mode="rb") as f:
        for i in xrange(0,16):
            chunk = f.read(chunk_size)
            if not chunk:
                break
            sha256.update(chunk)
    return sha256.hexdigest()

对于3GB文件,这需要一分钟,所以最后,16TB HD的过程可能会非常慢。

现在我的想法是使用一些关于文件的额外知识'内部结构加快速度:我知道它们包含一个小标题,然后是大量的测量数据,我知道它们包含实时时间戳,所以我很确定这个机会,让我们来吧比方说,两个文件中的前16MB是相同的,非常低(为了实现这一点,需要在完全相同的环境条件下同时创建两个文件)。所以我的结论是,它应该足以只散列每个文件的第一个X MB。

它适用于我的示例数据,但由于我没有经验,我只想询问是否有我不知道的事情(隐藏的危险或更好的方法)。

非常感谢!

1 个答案:

答案 0 :(得分:3)

您可以按breaking them into small byte chunks获取大型文件的MD5哈希值。

此外,计算MD5哈希值显着faster than SHA-256,并且出于性能原因,出于安全目的而不依赖于哈希的任何应用程序,应该优先考虑这些哈希值。