使用Python在网络上进行高效的大型文件哈希

时间:2012-03-13 07:20:25

标签: python hash sha1

我想比较两个不同网络位置的两个文件。这些文件的大小可以是几GB,有时文件位置可以用慢速WAN分隔。

我知道如何在Python中生成SHA1哈希,但我听说过一种方法可以散列多个文件部分,而不是整个文件,然后比较部分的哈希值。例如,从每个文件的开头,“中间”和结尾开始64KB。这是一种合法的方法吗?怎么办呢?

2 个答案:

答案 0 :(得分:2)

使用

仅下载部分文件
req = urllib2.Request(url)
req.headers['Range'] = 'bytes=%s-%s' % (start, end)
f = urllib2.urlopen(req)

然后你可以散列你下载的部分:

s = f.read()
hashlib.sha1(s).hexdigest()

当然为了确保文件是等效的,你必须对文件的每个部分进行哈希处理。

答案 1 :(得分:0)

也许您正在考虑hash listshash trees,它可用于减少数据传输(例如在bittorrent中)?不幸的是,他们在几个方面与你记得的不同:

  • 他们仍然散列所有文件(但是分成几部分)
  • 它们用于在构造散列时不降低网络成本,而是用于检测受限区域中的更改,以便需要传输更少的数据(例如,在bittorrent中,以识别必须下载文件的哪个部分)< / LI>
正如Sylvain Prat上面所说,只散列文件的几个部分是不可靠的,因为它只会检测这些部分的变化,而不是整个文件的变化。

在您的情况下,您可以在本地计算每个数据集的哈希列表(即在本地计算机上运行哈希计算)。然后,通过比较哪些哈希值匹配,哪些哈希值匹配,只传递不同的部分(如果这是你需要做的)。