From fca6a9a9e13913db01ebc75e5cd322f780468a0e Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Mon, 23 Jul 2012 16:19:56 -0500 Subject: [PATCH] Fix md5 nesting --- lib/linguist/md5.rb | 36 ++++++++++++------------------------ lib/linguist/samples.json | 2 +- test/test_md5.rb | 12 ++++++------ 3 files changed, 19 insertions(+), 31 deletions(-) diff --git a/lib/linguist/md5.rb b/lib/linguist/md5.rb index 4860bcda..0b43fd8a 100644 --- a/lib/linguist/md5.rb +++ b/lib/linguist/md5.rb @@ -11,40 +11,28 @@ module Linguist # Returns String hex digest def self.hexdigest(obj) digest = Digest::MD5.new - digest_strings(obj).each { |e| digest.update(e) } - digest.hexdigest - end - # Internal: Get String representations for digest. - # - # obj - Object to digest - # - # Returns an Array of Strings. - def self.digest_strings(obj) case obj - when String - ["#{obj.class}", "#{obj}"] - when Symbol - ["#{obj.class}", "#{obj}"] - when Integer - ["#{obj.class}", "#{obj}"] + when String, Symbol, Integer + digest.update "#{obj.class}" + digest.update "#{obj}" when TrueClass, FalseClass, NilClass - ["#{obj.class}"] + digest.update "#{obj.class}" when Array - r = ["#{obj.class}"] - obj.each do |e| - r.concat(digest_strings(e)) + digest.update "#{obj.class}" + for e in obj + digest.update(hexdigest(e)) end - r when Hash - r = ["#{obj.class}"] - obj.map { |k, v| digest_strings([k, v]) }.sort.each do |e| - r.concat(digest_strings(e)) + digest.update "#{obj.class}" + for e in obj.map { |(k, v)| hexdigest([k, v]) }.sort + digest.update(e) end - r else raise TypeError, "can't convert #{obj.inspect} into String" end + + digest.hexdigest end end end diff --git a/lib/linguist/samples.json b/lib/linguist/samples.json index 942f4d62..831615d8 100644 --- a/lib/linguist/samples.json +++ b/lib/linguist/samples.json @@ -20099,5 +20099,5 @@ "XSLT": 1, "YAML": 1 }, - "md5": "a0ebeafa2f804284407990bfedb1c7ee" + "md5": "5e73a20c894bdef413ab8409f9ba6406" } \ No newline at end of file diff --git a/test/test_md5.rb b/test/test_md5.rb index 789e8b36..6019fcf5 100644 --- a/test/test_md5.rb +++ b/test/test_md5.rb @@ -40,16 +40,16 @@ class TestMD5 < Test::Unit::TestCase def test_hexdigest_array assert_equal "4410ec34d9e6c1a68100ca0ce033fb17", MD5.hexdigest([]) - assert_equal "a57e31bc7bce57d04dd6a07e74fd0d88", MD5.hexdigest([1]) - assert_equal "ecbda6354c6e0370df33d43ce14701f4", MD5.hexdigest([1, 2]) - assert_equal "5c42a2601d344f359017e2b76390e2cc", MD5.hexdigest([1, 2, 3]) - assert_equal "c1816755a379d2b32289647ad1870d12", MD5.hexdigest([1, 2, [3]]) + assert_equal "759f28c1d0c20c22e79c91d339855d95", MD5.hexdigest([1]) + assert_equal "9efe07b352dd94cd1cdc9d1a8d054f8f", MD5.hexdigest([1, 2]) + assert_equal "60b1ef7201404f20c3d12f47499c3a1f", MD5.hexdigest([1, 2, 3]) + assert_equal "2f82cdc166616208077ff1dd0a8faeff", MD5.hexdigest([1, 2, [3]]) end def test_hexdigest_hash assert_equal "fae8a9257e154175da4193dbf6552ef6", MD5.hexdigest({}) - assert_equal "b3646d6d84a803baa5ee2e5354057a65", MD5.hexdigest({:a => 1}) - assert_equal "92c08085470d42ca0d33dd3ec5a8e098", MD5.hexdigest({:b => 2}) + assert_equal "868ee214faf277829a85667cf332749f", MD5.hexdigest({:a => 1}) + assert_equal "fa9df957c2b26de6fcca9d062ea8701e", MD5.hexdigest({:b => 2}) assert_not_equal MD5.hexdigest([:b, 2]), MD5.hexdigest({:b => 2})