【问题标题】:Efficient large file hash over network using Python使用 Python 在网络上进行高效的大文件散列
【发布时间】:2012-03-29 14:30:08
【问题描述】:

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

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

【问题讨论】:

  • 如果在非散列部分发生更改怎么办:两个文件将具有相同的散列但不同。我想这不是你所期望的。
  • 这是一个很好的观点。我认为在这种情况下我会没事的,因为这些文件是视频文件,不会被修改太多,而是用全新的版本替换。

标签: python hash sha1


【解决方案1】:

使用仅下载文件的一部分

req = urllib2.Request(url)
req.headers['Range'] = 'bytes=%s-%s' % (start, end)
f = urllib2.urlopen(req)

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

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

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

【讨论】:

    【解决方案2】:

    也许您正在考虑hash listshash trees,它们可以用来减少数据传输(例如在bittorrent 中)?不幸的是,它们与您记忆中的内容在以下几个方面有所不同:

    • 他们仍然对所有文件进行哈希处理(但是是分段的)
    • 它们不是用来降低构建哈希的网络成本,而是用来检测受限区域的变化,从而减少需要传输的数据(例如,在 bittorrent 中,确定必须下载文件的哪个部分)

    正如 Sylvain Prat 上面所说,仅对文件的少数部分进行哈希处理是不可靠的,因为它只会检测对这些部分的更改,而不是对整个文件的更改。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-25
      • 2015-10-09
      • 2017-05-30
      • 2012-06-08
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      相关资源
      最近更新 更多