我正在使用hashlib
模块来测试关于哈希算法的假设,我得到了奇怪的结果。我使用Windows fciv
程序检查结果。我正在使用的工作流程是:
fciv
测试结果。fciv
中的更新文件测试结果。问题在于:
当我使用.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.algorithm
为md5
,args.file
为用户提供的文件名。
答案 0 :(得分:1)
使用ab+
始终以二进制模式打开文件。否则,Windows上的Python将使用文本模式来识别文本文件。
但我确实想知道为什么你要使用ab+
而不是rb+
如果你打算像ab+
一样读取整个文件,文件指针会在结尾处开始,如同rb+
它从文件的开头开始。
有关文件模式的详细列表,请参阅https://stackoverflow.com/a/23566951。