以下代码显示托管在另一台计算机上的UNC共享上的三个文件具有相同的哈希值。它还显示本地文件具有不同的哈希值。为什么会这样?我觉得有一些我不了解的UNC考虑因素。
Python 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import hashlib
>>> fn_a = '\\\\some.host.com\\Shares\\folder1\\file_a'
>>> fn_b = '\\\\some.host.com\\Shares\\folder1\\file_b'
>>> fn_c = '\\\\some.host.com\\Shares\\folder2\\file_c'
>>> fn_d = 'E:\\file_d'
>>> fn_e = 'E:\\file_e'
>>> fn_f = 'E:\\folder3\\file_f'
>>> f_a = open(fn_a, 'r')
>>> f_b = open(fn_b, 'r')
>>> f_c = open(fn_c, 'r')
>>> f_d = open(fn_d, 'r')
>>> f_e = open(fn_e, 'r')
>>> f_f = open(fn_f, 'r')
>>> hashlib.md5(f_a.read()).hexdigest()
'54637fdcade4b7fd7cabd45d51ab8311'
>>> hashlib.md5(f_b.read()).hexdigest()
'54637fdcade4b7fd7cabd45d51ab8311'
>>> hashlib.md5(f_c.read()).hexdigest()
'54637fdcade4b7fd7cabd45d51ab8311'
>>> hashlib.md5(f_d.read()).hexdigest()
'd2bf541b1a9d2fc1a985f65590476856'
>>> hashlib.md5(f_e.read()).hexdigest()
'e84be3c598a098f1af9f2a9d6f806ed5'
>>> hashlib.md5(f_f.read()).hexdigest()
'e11f04ed3534cc4784df3875defa0236'
编辑:为了进一步调查此问题,我还使用其他主机的文件进行了测试。看来更改主机会改变结果。
>>> fn_h = '\\\\host\\share\\file'
>>> f_h = open(fn_h, 'r')
>>> hashlib.md5(f_h.read()).hexdigest()
'f23ee2dbbb0040bf2586cfab29a03634'
...但后来我在新主机上尝试了另一个文件,并获得了新的结果!
>>> fn_i = '\\\\host\\share\\different_file'
>>> f_i = open(fn_i, 'r')
>>> hashlib.md5(f_i.read()).hexdigest()
'a8ad771db7af8c96f635bcda8fdce961'
所以,现在我真的很困惑。它是否与原始主机为\\host.com
格式且新主机为\\host
格式的事实有关?
答案 0 :(得分:2)
我根据每个人提供的评论和答案做了一些额外的研究。我决定需要研究代码的这两个特征的排列:
原始字符串文字用于路径名称,即是否:
答:文件路径字符串是原始的,路径中有单个反斜杠,而不是
B.文件路径字符串不是原始的,路径中有双反斜杠
(对于那些不知道的人来说,原始字符串是由" r&#34进行的,如下所示:r'This is a raw string'
)
open
功能模式为r
或rb
(仅限那些不知道的人,b
模式中的rb
表示将文件读取为二进制文件。)
结果证明:
rb
中使用open
模式时,我得到了不同的结果。耶!谢谢你的帮助。
答案 1 :(得分:1)
如果您打算再次使用它,请使用f1.seek(0)
,否则它将是一个完全读取的文件,再次调用read()
只会返回一个空字符串。
答案 2 :(得分:1)
我不重现你的问题。我在Windows 7上使用Python 3.4,使用以下测试脚本访问网络硬盘上的文件:
import sys, hashlib
def main():
fn0 = r'\\NAS\Public\Software\Backup\Test\Vagrantfile'
fn1 = r'\\NAS\Public\Software\Backup\Test\z.xml'
with open(fn0, 'rb') as f:
h0 = hashlib.md5(f.read())
print(h0.hexdigest())
with open(fn1, 'rb') as f:
h1 = hashlib.md5(f.read())
print(h1.hexdigest())
if __name__ == '__main__':
sys.exit(main())
运行此结果会产生两个不同的哈希值(如预期的那样):
c:\src\python>python hashtest.py
8af202dffb88739c2dbe188c12291e3d
2ff3db61ff37ca5ceac6a59fd7c1018b
如果读取文件内容返回远程文件的不同数据,则将该数据传递到md5必须导致不同的散列值。您可能希望打印出每个文件的前80个字节,以检查您是否得到了您期望的结果。