在Python中使用哈希比较两个文件
在本文中,我们将创建一个程序来确定提供给它的两个文件是否相同。通过相同的方式,它们的内容是否相同(不包括任何元数据)。为此,我们将使用加密哈希。加密散列函数是一种接收输入数据并产生统计上唯一输出的函数,该输出对于该特定数据集是唯一的。我们将使用密码散列函数的这个属性来识别两个文件的内容,然后将其进行比较以确定它们是否相同。
注意:对于两个不同的数据集,得到相同的概率非常低。即便如此,良好的加密散列函数也会被制作出来,以便散列冲突是偶然的,而不是有意的。
我们将在此程序中使用SHA256 (安全哈希算法 256)作为哈希函数。 SHA256 非常耐碰撞。我们将使用 hashlib 库的 sha256() 来使用Python中的函数实现。
hashlib 模块预装在大多数Python发行版中。如果它在您的环境中不存在,那么您可以通过在命令中运行以下命令来获取该模块–
pip install hashlib
下面是实现。
文本文件 1:
文本文件 2:
Python3
import sys
import hashlib
def hashfile(file):
# A arbitrary (but fixed) buffer
# size (change accordingly)
# 65536 = 65536 bytes = 64 kilobytes
BUF_SIZE = 65536
# Initializing the sha256() method
sha256 = hashlib.sha256()
# Opening the file provided as
# the first commandline argument
with open(file, 'rb') as f:
while True:
# reading data = BUF_SIZE from
# the file and saving it in a
# variable
data = f.read(BUF_SIZE)
# True if eof = 1
if not data:
break
# Passing that data to that sh256 hash
# function (updating the function with
# that data)
sha256.update(data)
# sha256.hexdigest() hashes all the input
# data passed to the sha256() via sha256.update()
# Acts as a finalize method, after which
# all the input data gets hashed hexdigest()
# hashes the data, and returns the output
# in hexadecimal format
return sha256.hexdigest()
# Calling hashfile() function to obtain hashes
# of the files, and saving the result
# in a variable
f1_hash = hashfile(sys.argv[1])
f2_hash = hashfile(sys.argv[2])
# Doing primitive string comparison to
# check whether the two hashes match or not
if f1_hash == f2_hash:
print("Both files are same")
print(f"Hash: {f1_hash}")
else:
print("Files are different!")
print(f"Hash of File 1: {f1_hash}")
print(f"Hash of File 2: {f2_hash}")
输出:
对于不同的文件作为输入:
对于与输入相同的文件:
解释:-
我们输入文件名(通过命令行参数),因此必须从命令行提供文件路径。定义了函数hashfile() 来处理任意文件大小而不会耗尽内存。就好像我们将文件中的所有数据传递给 sha256.update()函数一样,它不会正确散列数据,从而导致结果不一致。 hashfile() 以 base16(十六进制格式)返回文件的哈希值。我们为这两个文件调用相同的函数,并将它们的哈希值存储在两个单独的变量中。之后我们使用哈希来比较它们。如果两个哈希值相同(意味着文件包含相同的数据),我们输出消息两个文件都相同,然后是哈希值。如果它们不同,我们会输出一条否定消息,以及每个文件的哈希值(以便用户可以直观地看到不同的哈希值)。