📜  在Python中使用哈希比较两个文件

📅  最后修改于: 2022-05-13 01:55:36.140000             🧑  作者: Mango

在Python中使用哈希比较两个文件

在本文中,我们将创建一个程序来确定提供给它的两个文件是否相同。通过相同的方式,它们的内容是否相同(不包括任何元数据)。为此,我们将使用加密哈希。加密散列函数是一种接收输入数据并产生统计上唯一输出的函数,该输出对于该特定数据集是唯一的。我们将使用密码散列函数的这个属性来识别两个文件的内容,然后将其进行比较以确定它们是否相同。

注意:对于两个不同的数据集,得到相同的概率非常低。即便如此,良好的加密散列函数也会被制作出来,以便散列冲突是偶然的,而不是有意的。

我们将在此程序中使用SHA256 (安全哈希算法 256)作为哈希函数。 SHA256 非常耐碰撞。我们将使用 hashlib 库的 sha256() 来使用Python中的函数实现。
hashlib 模块预装在大多数Python发行版中。如果它在您的环境中不存在,那么您可以通过在命令中运行以下命令来获取该模块–

pip install hashlib

下面是实现。
文本文件 1:

compare-2-files-hash-pQython-1

文本文件 2:

compare-2-files-hash-python-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}")


输出:
对于不同的文件作为输入:

python-compare-2-files-hash-1

对于与输入相同的文件:

python-compare-2-files-ash-2

解释:-
我们输入文件名(通过命令行参数),因此必须从命令行提供文件路径。定义了函数hashfile() 来处理任意文件大小而不会耗尽内存。就好像我们将文件中的所有数据传递给 sha256.update()函数一样,它不会正确散列数据,从而导致结果不一致。 hashfile() 以 base16(十六进制格式)返回文件的哈希值。我们为这两个文件调用相同的函数,并将它们的哈希值存储在两个单独的变量中。之后我们使用哈希来比较它们。如果两个哈希值相同(意味着文件包含相同的数据),我们输出消息两个文件都相同,然后是哈希值。如果它们不同,我们会输出一条否定消息,以及每个文件的哈希值(以便用户可以直观地看到不同的哈希值)。