相同文件的Python散列结果不同

相同文件的Python散列结果不同,python,hash,Python,Hash,我编写了一个简单的Python脚本,将文件从一个地方复制到另一个地方。(这是为了上课,所以我不使用像shutil这样简单的东西。我在最后做了一个检查,比较了两个文件的散列,它始终告诉我它们是不同的,即使复制成功了——它们都是说“hello world”的文本文件 这是我的密码: import os def validity_checker(address1, dest_name): try: src = open(address1, 'rb') dest

我编写了一个简单的Python脚本,将文件从一个地方复制到另一个地方。(这是为了上课,所以我不使用像
shutil
这样简单的东西。我在最后做了一个检查,比较了两个文件的散列,它始终告诉我它们是不同的,即使复制成功了——它们都是说“hello world”的文本文件

这是我的密码:

import os

def validity_checker(address1, dest_name):
    try:
        src = open(address1, 'rb')
        dest = open(dest_name, 'wb+')
    except IOError:
        return False
    return True


def copaste(address1, address2):
    # concatenate address2 into filename
    file_ending = address1.split('\\').pop()
    dest_name = address2 + '\\' + file_ending

    # copy file after calling checker
    if validity_checker(address1, dest_name):
        src = open(address1, 'rb')
        dest = open(dest_name, 'wb+')
        contents = src.read()
        dest.write(contents)
        src.close()
        dest.close()
    else:
        print("File name bad. No action taken")

    print src
    print dest
    print(hash(src))  #hash the file not the string
    print(hash(dest))
    return
以及输出:

<closed file 'C:\\Users\\user\\Downloads\\hello.txt', mode 'rb' at 0x04B7D1D8>
<closed file 'C:\\Users\\user\\Downloads\\dest\\hello.txt', mode 'wb+' at 0x04C2B860>
-2042961099
4991878

-2042961099
4991878
再加上文件被复制


我敢肯定哈希是在检查文件本身,而不是字符串。这可能与元数据有关吗?如果您能提供任何帮助,我们将不胜感激。

您使用的是特定于Python的,它计算哈希值,以便在字典键和
集合
内容上使用

对于文件对象,
hash()
基于对象标识;不能基于任何其他内容,因为两个不同的文件对象永远不相等,
fileobject.\uuu eq\uuu
方法仅当两个对象在内存中是一个且相同时才返回
True
(因此
is
也将是True)。文件内容、文件名、模式或任何其他对象属性在生成的哈希值中不起作用

从函数文档中:

返回对象的哈希值(如果有)。哈希值是整数。它们用于在字典查找期间快速比较字典键。

如果需要验证文件副本是否包含相同的数据,则需要使用完全不同的加密哈希函数对•文件内容*进行哈希。对于您的用例,使用简单快速的
MD5
算法可以:

for closed_file in (src, dest):
    with open(closed_file.name, 'rb') as reopened:  # opened in binary mode!
        print(reopened.name)
        print(hashlib.md5(reopened.read()).hexdigest())

如果两个文件的二进制内容完全相同,那么它们的加密散列也将相同。

您得到的是
文件
对象的python散列。而不是文件的内容。至少您应该

print(hash(open(address1, 'rb').read())
print(hash(open(dest_name, 'rb').read())

但是,由于这仍然存在冲突的风险,您应该按照Martijn的建议,使用
hashlib
函数。

hash()
不是加密哈希函数。这里的
file
是什么?您从未定义过该名称。您的意思是
print(hash(src))
也许?这不会改变结果。我做到了,谢谢-修复谢谢你的回答,我觉得很愚蠢。但是,即使切换到hashlib库,问题仍然存在。我已经更新了问题以反映这一点。请不要这样做;你原来的错误已经解决了,你有一个新问题需要重新解决操作。我已回滚了您的编辑。您的新问题是您没有重新打开
src
文件,也没有执行返回开始的搜索,因此
src.read()
第二次生成一个空字符串。您正在比较
b''
的哈希值,因此比较失败。请使用我在回答中发布的代码!我对违反礼仪表示歉意,再次感谢您的帮助。我原以为关闭和重新打开文件并不重要-现在我知道得更清楚了!