0

我正在编写一个程序,该程序从推文和图像中搜索以将两者结合起来。我有一个内置的两个数组,它们保存所用推文的 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)在应该为真的地方返回假

4

1 回答 1

0

从您所说的来看,您似乎在质疑为什么:

["#{foo}"].include?(foo)

始终为真foo表达式在哪里MD5.hexdigest(tweet[0])。但是只要foo返回一个字符串,上面的表达式就永远为真,MD5.hexdigest确实如此。

于 2013-08-17T22:12:13.647 回答