相同文件的Python散列结果不同
我编写了一个简单的Python脚本,将文件从一个地方复制到另一个地方。(这是为了上课,所以我不使用像相同文件的Python散列结果不同,python,hash,Python,Hash,我编写了一个简单的Python脚本,将文件从一个地方复制到另一个地方。(这是为了上课,所以我不使用像shutil这样简单的东西。我在最后做了一个检查,比较了两个文件的散列,它始终告诉我它们是不同的,即使复制成功了——它们都是说“hello world”的文本文件 这是我的密码: import os def validity_checker(address1, dest_name): try: src = open(address1, 'rb') dest
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''
的哈希值,因此比较失败。请使用我在回答中发布的代码!我对违反礼仪表示歉意,再次感谢您的帮助。我原以为关闭和重新打开文件并不重要-现在我知道得更清楚了!