尽可能快地哈希1000个图像文件(2000x2000 +分辨率)(Python)

时间:2019-01-02 01:44:31

标签: python database python-3.x image hash

我的计算机上有一个文件夹,其中包含约数千个RGB 8位每通道图像文件,分辨率在2000x2000和8000x8000之间(因此它们中的大多数都非常大)。

我想为每个图像存储一些小的值,例如哈希值,以便将来有一个我可以轻松比较的值,以查看是否有任何图像文件已更改。该值的计算有三个主要要求:

  1. 此值的计算需要快速
  2. 如果图像文件的任何部分发生更改(即使是很小的变化,即使仅改变一个像素),结果也必须有所不同。 (哈希不应该考虑文件名)。
  3. 基本上不应该发生冲突。

我可以采用多种方法来解决此问题,例如sha1,md5等,但此处的真正目标是速度,实际上,这只是任何一种非常快速的方法来确定是否对某个对象进行了任何更改。图片。

您将如何在Python中实现这一目标?您是否建议使用特定的哈希算法来提高速度?还是可以设计出一种完全实现我的三个目标的方法?

1 个答案:

答案 0 :(得分:1)

  
      
  1. 此值的计算需要快速
  2.   
  3. 如果图像文件的任何部分发生更改(即使是很小的变化,即使仅改变一个像素),结果也必须有所不同。   (哈希不应该考虑文件名)。
  4.   
  5. 基本上不应该发生冲突。
  6.   
  1. 大文件的哈希计算(可能会因哈希算法而异)需要时间,如果需要快速,请尝试为您的任务选择高效的哈希算法。您可以找到有关它们之间相互比较的信息。但是,在检查哈希之前,您可以通过检查其他内容来优化算法。
  2. 如果您决定使用哈希,就是这种情况。即使图像的一小部分已更改,哈希值也将更改。
  3. 可能会发生冲突(非常少见,但never除外)。这就是hash algorithms
  4. 的本质

第一个示例(优化算法),

  • 检查文件大小。
  • 如果大小相等,请检查CRC
  • 如果CRC相等,则计算并检查哈希。 (都需要传递文件)

(可选)在检查散列之前,您可以部分地计算和比较散列,而不是所有文件。

如果大多数文件可能会有所不同,那么在计算散列值之前检查其他内容可能会更快。

但是,如果您的大多数文件都相同,那么散列之前的步骤只会消耗更多时间。因为您已经必须计算大多数文件的哈希值。

因此请尝试根据您的情况实施最有效的算法。