7

I want to compare hashes of two files. But no matter if files are different or not, even with different hashes comparison results True

Here is the code:

import hashlib

hasher1 = hashlib.md5()
afile1 = open('canvas.png', 'rb')
buf1 = afile1.read()
a = hasher1.update(buf1)
print(str(hasher1.hexdigest()))

hasher2 = hashlib.md5()
afile2 = open('img5.png', 'rb')
buf2 = afile2.read()
b = hasher2.update(buf2)
print(str(hasher2.hexdigest()))

print(str(a) == str(b))

The output:

614c9853a7f62c5b60d7d15bde80708f
76dc116b2c1b19b265db5e657846e649
True

Process finished with exit code 0
Jiaaro
  • 74,485
  • 42
  • 169
  • 190
VAGrus
  • 73
  • 1
  • 1
  • 6

3 Answers3

10

As a general rule Python methods follow the principle of command-query separation -- so that methods that modify the object (i.e. commands) return None. This includes, for example, list.sort, and dict.update. It is also true of the hasher1.update method. So

a = hasher1.update(buf1)

assigns None to a. Instead, use

hasher1.update(buf1)
a = hasher1.hexdigest()

and similarly for b.


import hashlib

digests = []
for filename in ['canvas.png', 'img5.png']:
    hasher = hashlib.md5()
    with open(filename, 'rb') as f:
        buf = f.read()
        hasher.update(buf)
        a = hasher.hexdigest()
        digests.append(a)
        print(a)

print(digests[0] == digests[1])
unutbu
  • 842,883
  • 184
  • 1,785
  • 1,677
  • Hey unutbu, how would I be able to edit this code so that I am prompted to select two files to compare the MD5 hashes? I tried using tKinter but received an error of "TypeError: expected str, bytes or os.PathLike object, not tuple". Thanks in advance. I can create another question with this code if you would like to see what I have previously tried (unable to post in reply as it exceeds character limit). – Jaden-Dz99 Mar 06 '20 at 05:51
1

This worked for me :

import hashlib
#File 1
hasher1 = hashlib.md5()
afile1 = open('C:/.../elephant_rgb.png', 'rb')
buf1 = afile1.read()
a = hasher1.update(buf1)
md5_a=(str(hasher1.hexdigest()))
#File 2
hasher2 = hashlib.md5()
afile2 = open('C:/.../innDay-Pic2.png', 'rb')
buf2 = afile2.read()
b = hasher2.update(buf2)
md5_b=(str(hasher2.hexdigest()))
#Compare md5
if(md5_a==md5_b):
    print("Yes")
else:
    print("No")

##No
Ani Menon
  • 27,209
  • 16
  • 105
  • 126
0

I do not think it is necessary to create hasher objects. You should be able to use the md5 function from the hashlib module directly.

digest = hashlib.md5(fileobj.read()).hexdigest()

So you can write something like this:

from hashlib import md5
digests = list()
for filename in ['canvas.png', 'img5.png']:
    with open(filename, 'rb') as f:
        digest = md5(f.read()).hexdigest()
        digests.append(digest)

print(digests[0] == digests[1])
AlexP
  • 86
  • 1
  • 4