Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何计算两个相似文件的相同哈希?_Python_Python 3.x - Fatal编程技术网

Python 如何计算两个相似文件的相同哈希?

Python 如何计算两个相似文件的相同哈希?,python,python-3.x,Python,Python 3.x,我想应用一个散列算法,如果两个文件相似,则散列相同。如果丢失一位,则文件的散列将更改。我可以在Python中应用什么算法来解决这个问题 多谢各位 我听说布洛克会这么做,但我不知道如何应用它 我应用了以下算法,但它没有帮助 import hashlib file = "Annotation 2020-04-09 163448.png" # Location of the file (can be set a different way) BLOCK_SIZE = 65536 # The size

我想应用一个散列算法,如果两个文件相似,则散列相同。如果丢失一位,则文件的散列将更改。我可以在Python中应用什么算法来解决这个问题

多谢各位

我听说布洛克会这么做,但我不知道如何应用它

我应用了以下算法,但它没有帮助

import hashlib

file = "Annotation 2020-04-09 163448.png" # Location of the file (can be set a different way)
BLOCK_SIZE = 65536 # The size of each read from the file

file_hash = hashlib.sha256() # Create the hash object, can use something other than `.sha256()` if you wish
with open(file, 'rb') as f: # Open the file to read it's bytes
    fb = f.read(BLOCK_SIZE) # Read from the file. Take in the amount declared above
    while len(fb) > 0: # While there is still data being read from the file
        file_hash.update(fb) # Update the hash
        fb = f.read(BLOCK_SIZE) # Read the next block from the file

print (file_hash.hexdigest()) # Get the hexadecimal digest of the hash

散列算法的全部要点是,如果源文件中的任何一位不同,它们就会变得完全不同,以确保生成散列冲突变得具有挑战性。以下是一些解决方法:

  • 找到“相似”但不相同文件的唯一可靠方法是比较每个部分的整个文件内容以计算相似性分数。然而,这是相当低效的,因为这将是一个具有频繁硬盘驱动器往返的O(n^2)算法

  • 另一种方法是可能只散列每个文件的一部分。这将有相同的问题,如果这部分中只有一位不同,文件将不同。但是,您可能可以忽略空格、标记或大小写,或者只对文件头进行哈希,或者忽略每个颜色值的最后几位。有很多选项可以删除相关性较低的数据以创建精度较低的哈希。您可以在这里使用块哈希作为一种小型优化,以避免重复加载大文件,并首先检查是否有足够多的块相似

  • 您还可以将这些技术结合起来,使用散列以快速方式检查基本文件元数据是否正确,然后使用较慢的算法仅在散列匹配时计算相似性分数。这结合了进近1的一些精度和进近2的一些速度,尽管精度和速度都不会很高

  • 最后一个选择是使用非常弱的散列算法。如果您只使用
    sum(file)%(2^32)
    ,在某些情况下,类似的文件会给出很多类似的哈希值,但是很难根据最终的哈希值确定实际的相似性,因为文件中任何地方的一个字节的差异都会使哈希值产生很大的差异,如果您将所有哈希值都包含在256以内,许多文件仍然会被认为是相似的,即使它们不是,并且您错过了所有相差两个字节或更多的文件


  • 这取决于您的用例,这些技术中哪些适合您,但请注意,这不是一项容易的任务。祝你好运

    据我所知,您需要一个哈希算法,如果文件相似,它将返回一个相似的哈希,对吗?是的@mousetail,它是correctOr,类似于块哈希。我们从文件中计算X个散列量。如果80%的散列匹配,那么文件是相同的?我想说加密散列函数的全部要点是,如果输入稍有变化,它们就会完全不同。正常的散列函数只将任意大小的输入映射到固定大小的输出。是的,您是对的,对于非加密散列函数,更改每一位的散列的理由有点不同,主要是因为当您有大量类似的条目时,这正是避免冲突的最佳方法