任何UNC文件的Python hashlib MD5摘要总是产生相同的哈希值

时间:2015-06-13 06:50:18

标签: python python-2.7 unc hashlib

以下代码显示托管在另一台计算机上的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格式的事实有关?

3 个答案:

答案 0 :(得分:2)

我根据每个人提供的评论和答案做了一些额外的研究。我决定需要研究代码的这两个特征的排列:

  1. 原始字符串文字用于路径名称,即是否:
    答:文件路径字符串是原始的,路径中有单个反斜杠,而不是
    B.文件路径字符串不是原始的,路径中有双反斜杠

    (对于那些不知道的人来说,原始字符串是由" r&#34进行的,如下所示:r'This is a raw string'

  2. open功能模式为rrb (仅限那些不知道的人,b模式中的rb表示将文件读取为二进制文件。)

  3. 结果证明:

    • 字符串文字/反斜杠对不同文件的哈希是否不同没有区别
    • 我的错误是没有以二进制模式打开文件。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个字节,以检查您是否得到了您期望的结果。