如何快速识别同一张图片
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 成本足够小,这可能是可以接受的。
我有很多图片,其中一些图片除了文件名外完全相同,目前我通过计算每张图片的 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 成本足够小,这可能是可以接受的。