我需要一个智能复制功能,以实现可靠,快速的文件复制。链接。文件非常大(从几千兆字节到超过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。
它适用于我的示例数据,但由于我没有经验,我只想询问是否有我不知道的事情(隐藏的危险或更好的方法)。
非常感谢!
答案 0 :(得分:3)
您可以按breaking them into small byte chunks获取大型文件的MD5哈希值。
此外,计算MD5哈希值显着faster than SHA-256,并且出于性能原因,出于安全目的而不依赖于哈希的任何应用程序,应该优先考虑这些哈希值。