我想应用哈希算法,其中哈希是相同的,如果两个文件相似。如果丢失了一位,文件的哈希就会改变。我可以在Python中应用任何算法来解决这个问题吗?
谢谢
我听说block hasing会这么做,但我不知道该怎么做。
我应用了以下算法,但它对没有帮助
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以内,许多文件仍然会被认为是相似的,即使它们不是,并且您会错过所有相差两个字节或更多的文件。
这取决于您的用例,这些技术中的哪一种适用于您,但请注意,这不是一项容易的任务。祝你好运