如何以更快的方式识别相同的图像

时间:2016-05-26 23:31:09

标签: ruby image hash md5 digest

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如果你正在使用CRuby,那么MD5图片包含多个进程,如果你正在使用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)