如何快速识别同一张图片

How to identify the same image in a faster way

我有很多图片,其中一些图片除了文件名外完全相同,目前我通过计算每张图片的 MD5 对它们进行分组,但对它们进行哈希处理看起来很慢。有没有其他方法可以让它更快?如果我在散列之前调整图像大小会有帮助吗?

MD5 如果您使用的是 CRuby,则该图片具有多个进程;如果您使用的是 Rubinius 或 JRuby,则该图片具有多个线程

多进程

workers = 4  # >= number of CPU cores

file_groups = Dir['/path/to/pic/folder/*'].each_with_index.group_by{|filename, i| i % workers}.values

file_groups.each do |group|
  fork do
    group.each do |filename, _|
      # MD5 the file
    end
  end
end

Process.waitall

多线程

workers = 4  # >= number of CPU cores

file_groups = Dir['/path/to/pic/folder/*'].each_with_index.group_by{|filename, i| i % workers}.values

threads = file_groups.map do |group|
  Thread.new do
    group.each do |filename, _|
      # MD5 the file
    end
  end
end

threads.each(&:join)

您可以按 [filesize, partial hashcode] 对文件进行分组,"partial hashcode" 是(例如)文件中某些 [N, filesize].min 字节块的散列(例如,在文件的开头或结尾)文件)。当然,N 的选择会影响将两个不同文件组合在一起的概率,但如果创建错误分组的概率 and/or 成本足够小,这可能是可以接受的。