在3个地方散列一个文件的小块是一个很好的验证?

时间:2013-11-17 23:28:20

标签: python hash verification

我在网络周围移动了很多大型视频文件,我采用了一种在复制后比较文件的方法,以确保它们是相同的。即使在网络上,该方法也非常快。麻烦的是,我不确定它是否足够。本质上,我从每个文件的开始/中间/结尾散列一个小块,连接哈希并比较它们。我希望得到一些关于这种方法有效性的反馈或建议。例如,如果两个文件中的一个包含编辑,该文件大小相同,并且也超出了三个哈希点的范围。在这种情况下,该方法可以解决文件的相等性吗?

这就是我所做的(在Python中):

def get_hash(filename):
    try:
        f = open(filename, 'rb')
    except:
        raise

    hash_string = ''
    chunk_size = 1024
    size = os.stat(filename).st_size
    if size >= (chunk_size * 3):
        hash_string += sha256(f.read(chunk_size)).hexdigest()
        f.seek(size / 2)
        hash_string += sha256(f.read(chunk_size)).hexdigest()
        f.seek(size - chunk_size)
        hash_string += sha256(f.read(chunk_size)).hexdigest()
    else:
        get_full_hash(filename)

    f.close()
    return unicode(hash_string)

1 个答案:

答案 0 :(得分:0)

  

在这种情况下,该方法是否可以解决文件的相等问题?

是的,当然可以。

即使是整个文件的哈希也可能“撒谎” - 尽管使用像sha256这样的东西,碰撞的可能性会非常低。唯一可以确定的方法是比较两个文件的全部内容。

整个文件的散列速度有多慢?

你的方法“足够好”吗?有可能。如果您正在寻找重复的视频文件,这可能是一个不错的选择。如果您担心在大型副本中损坏的几个字节,这可能不是一个很好的选择。

最终,这是你愿意冒多大风险的问题。