我正在编写一个程序,可以从推文和图像中搜索两者。我有一个内置的两个数组,用于保存所使用的推文的MD5哈希值和使用的图像的uri,我在使用新搜索结果之前检查这些数据,所以我不再使用相同的东西了。
这是我用来检查推文是否包含我不想要或不在MD5哈希集合中的字符的代码
unless (/@/.match(tweet[0]) or /http/.match(tweet[0]) or /^#/.match(tweet[0]) or md5list.include?(Digest::MD5.hexdigest(tweet[0])))
其中md5list是像这样填充的集合
md5list << "#{Digest::MD5.hexdigest(tweet[0])}"
但md5list.include?(Digest::MD5.hexdigest(tweet[0]))
似乎总是返回true,即使数组是空的
有人能发现我在这里乱搞的地方吗? 感谢
编辑:
该集合包含许多MD5哈希值的文本字符串,我想在此集合中搜索我拥有的随机字符串的哈希值,并且只有在集合中尚未存在的情况下才执行代码。
要做到这一点,我基本上使用了unless (set.include?(Digest::MD5.hexdigest("test")
如果集合包含它,则应返回true;如果不包含,则返回false。我已经在irb中对此进行了测试,似乎可以正常工作
irb(main):009:0> s = Set.new
=> #<Set: {}>
irb(main):010:0> s << Digest::MD5.hexdigest("test")
=> #<Set: {"9cdfb439c7876e703e307864c9167a15"}>
irb(main):011:0> s.include?("test")
=> false
irb(main):012:0> s.include?(Digest::MD5.hexdigest("test"))
=> true
irb(main):013:0> s.include?(Digest::MD5.hexdigest("test2"))
=> false
但在我的实现中,似乎总是返回true。
修改
一些,呃更多的东西。 (这是完整的代码,我会尽量不发布到大块:https://github.com/rolandshoemaker/bleak-tweets/blob/master/bleak-tweet.rb)
这是失败的功能。它应该搜索一个图像,并且只有当uri的md5哈希值已经不在imagemd5集中时,它才会修复图像,做一些事情,然后将uri的md5哈希值添加到集合中,以便相同的图像将不再使用。
def imageSearch(tag, tweet, imagemd5)
Google::Search::Image.new(:query => tag).each do |image|
unless (imagemd5.include?(Digest::MD5.hexdigest(image.uri)))
filename = String.new
open(image.uri) { |f|
File.open("current", "wb") do |file|
file.puts f.read
end
img = Magick::Image::read("current").first
img.resize_to_fit!(600, 600)
drawable = Magick::Draw.new
drawable.pointsize = 18.0
#drawable.gravity = Magick::SouthEastGravity
drawable.font_weight = Magick::BoldWeight
tm = drawable.get_type_metrics(img, tweet)
drawable.fill = 'black'
#drawable.opacity(1)
xy1 = [0, (((img.rows)*6)/10)]
xy2 = [(((img.columns)*8)/10), (((img.rows)*9)/10)]
drawable.rectangle(xy1[0],xy1[1],xy2[0],xy2[1])
drawable.draw(img)
position = xy1[1]+10
wraptext(tweet, ((xy2[0]-xy1[0])-10)/10).each do |row|
drawable.annotate(img,(xy2[0]-xy1[0])-10,(xy2[1]-xy1[1])-10,10,position += 15,row) {self.fill='white'}
end
filename = "testy." << img.format
img.write(filename)
}
puts imagemd5.include?(Digest::MD5.hexdigest(image.uri)).inspect
imagemd5 << "#{Digest::MD5.hexdigest(image.uri)}"
puts imagemd5.include?(Digest::MD5.hexdigest(image.uri)).inspect
tumblrPost(tag, filename)
File.delete(filename)
File.delete("current")
break
end
end
end
这会输出一个图像并在控制台中输出(带有示例推文)
Damn this swollen ankle. Smh #injured #painful
false
true
问题在于,在这种情况下,程序使用的图像是已经使用过的图像,但是imagemd5.include?(Digest::MD5.hexdigest(image.uri)
在应该为真的情况下返回false
答案 0 :(得分:0)
根据你的说法,你似乎在质疑为什么:
["#{foo}"].include?(foo)
如果foo
是表达式MD5.hexdigest(tweet[0])
,始终为true。但只要foo
返回MD5.hexdigest
所做的字符串,上述表达式就会一直为真。