Python hashlib模块产生奇怪的结果

时间:2014-12-11 09:35:18

标签: python algorithm hash

我正在使用hashlib模块来测试关于哈希算法的假设,我得到了奇怪的结果。我使用Windows fciv程序检查结果。我正在使用的工作流程是:

  1. 从用户处收集文件和算法。
  2. 使用该算法打印原始文件名和散列文件。
  3. 在Windows中使用fciv测试结果。
  4. 在文件中添加几个字节或空格字符。
  5. 使用所选算法打印出新的散列文件。
  6. 使用fciv中的更新文件测试结果。
  7. 问题在于:

    当我使用.txt文件时,我得到了不同的结果,正如我对我的程序和fciv所期望的那样。这非常有效。

    这是输出:

    Original Filename: example_docs\testDocument.txt
    Original md5 Hash: 62bef8046d4bcbdc46ac81f5e4202fe7
    Updated md5 Hash: 78a96b792cf2ea160db5e4823f4bf0c5
    

    但是,当我使用.mp4视频文件时,fciv会显示不同的哈希值,但我的程序却没有。

    这是输出:

    Original Filename: example_docs\testVideo.mp4
    Original md5 Hash: 9a7dcb986e2e756dda60e851a0b03916
    Updated md5 Hash: 9a7dcb986e2e756dda60e851a0b03916
    

    我运行程序的次数无关紧要,我的程序输出中的哈希值保持不变,但fciv显示不同的结果。

    这是我的代码段:

    def getHash(filename, algorithm):
        h = hashlib.new(algorithm)
        h.update(filename)
        return h.hexdigest()
    
    print "Original Filename: {file}".format(file=args.file)
    with open(args.file, "a+") as inFile:
        h = getHash(inFile.read(), args.algorithm)
        print "Original {hashname} Hash: {hashed_file}".format(hashname=args.algorithm, hashed_file=h)              
    
    with open(args.file, "a+") as inFile:               
        inFile.write(b'\x07\x08\x07') # Also worked with inFile.write(" ")
    
    with open(args.file, "a+") as inFile:
        h = getHash(inFile.read(), args.algorithm)
            print "Updated {hashname} Hash: {hashed_file}".format(hashname=args.algorithm, hashed_file=h)
    

    其中args.algorithmmd5args.file为用户提供的文件名。

1 个答案:

答案 0 :(得分:1)

使用ab+始终以二进制模式打开文件。否则,Windows上的Python将使用文本模式来识别文本文件。

但我确实想知道为什么你要使用ab+而不是rb+如果你打算像ab+一样读取整个文件,文件指针会在结尾处开始,如同rb+它从文件的开头开始。

有关文件模式的详细列表,请参阅https://stackoverflow.com/a/23566951