summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--NEWS6
-rw-r--r--ext/digest/digest.c14
-rw-r--r--ext/digest/lib/digest.rb27
-rw-r--r--test/digest/test_digest.rb16
5 files changed, 61 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index d74bf9cd99..44a232e52b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+Mon Jan 18 04:15:58 2010 Akinori MUSHA <knu@iDaemons.org>
+
+ * ext/digest/digest.c (rb_digest_instance_digest)
+ (rb_digest_instance_hexdigest): Save a method call of reset()
+ for a disposable clone.
+
+ * ext/digest/digest.c (rb_digest_instance_hexdigest_bang): Fix
+ rdoc.
+
+ * ext/digest/lib/digest.rb (Digest::Class.base64digest)
+ (Digest::Instance#base64digest{,!}): New methods.
+
Mon Jan 18 03:39:05 2010 Akinori MUSHA <knu@iDaemons.org>
* lib/base64.rb (Base64#{strict_encode64,strict_decode64,urlsafe_encode64,
diff --git a/NEWS b/NEWS
index c6bc5145b1..f595ea0690 100644
--- a/NEWS
+++ b/NEWS
@@ -194,6 +194,12 @@ with all sufficient information, see the ChangeLog file.
Added as an alias to #ungetc.
+* digest
+ * new methods:
+ * Digest::Class.base64digest
+ * Digest::Instance#base64digest
+ * Digest::Instance#base64digest!
+
* rss
* 0.2.4 -> 0.2.7.
diff --git a/ext/digest/digest.c b/ext/digest/digest.c
index 88a7206f76..7c07fc3cac 100644
--- a/ext/digest/digest.c
+++ b/ext/digest/digest.c
@@ -179,10 +179,7 @@ rb_digest_instance_digest(int argc, VALUE *argv, VALUE self)
value = rb_funcall(self, id_finish, 0);
rb_funcall(self, id_reset, 0);
} else {
- VALUE clone = rb_obj_clone(self);
-
- value = rb_funcall(clone, id_finish, 0);
- rb_funcall(clone, id_reset, 0);
+ value = rb_funcall(rb_obj_clone(self), id_finish, 0);
}
return value;
@@ -227,10 +224,7 @@ rb_digest_instance_hexdigest(int argc, VALUE *argv, VALUE self)
value = rb_funcall(self, id_finish, 0);
rb_funcall(self, id_reset, 0);
} else {
- VALUE clone = rb_obj_clone(self);
-
- value = rb_funcall(clone, id_finish, 0);
- rb_funcall(clone, id_reset, 0);
+ value = rb_funcall(rb_obj_clone(self), id_finish, 0);
}
return hexencode_str_new(value);
@@ -240,8 +234,8 @@ rb_digest_instance_hexdigest(int argc, VALUE *argv, VALUE self)
* call-seq:
* digest_obj.hexdigest! -> string
*
- * Returns the resulting hash value and resets the digest to the
- * initial state.
+ * Returns the resulting hash value in a hex-encoded form and resets
+ * the digest to the initial state.
*/
static VALUE
rb_digest_instance_hexdigest_bang(VALUE self)
diff --git a/ext/digest/lib/digest.rb b/ext/digest/lib/digest.rb
index 0c4ee3c2cc..30805c0a6d 100644
--- a/ext/digest/lib/digest.rb
+++ b/ext/digest/lib/digest.rb
@@ -1,4 +1,5 @@
require 'digest.so'
+autoload :Base64, 'base64'
module Digest
def self.const_missing(name)
@@ -28,6 +29,13 @@ module Digest
def self.file(name)
new.file(name)
end
+
+ # Returns the base64 encoded hash value of a given _string_. The
+ # return value is properly padded with '=' and contains no line
+ # feeds.
+ def self.base64digest(str, *args)
+ Base64.strict_encode64(digest(str, *args))
+ end
end
module Instance
@@ -42,6 +50,25 @@ module Digest
}
self
end
+
+ # If none is given, returns the resulting hash value of the digest
+ # in a base64 encoded form, keeping the digest's state.
+ #
+ # If a _string_ is given, returns the hash value for the given
+ # _string_ in a base64 encoded form, resetting the digest to the
+ # initial state before and after the process.
+ #
+ # In either case, the return value is properly padded with '=' and
+ # contains no line feeds.
+ def base64digest(str = nil)
+ Base64.strict_encode64(str ? digest(str) : digest)
+ end
+
+ # Returns the resulting hash value and resets the digest to the
+ # initial state.
+ def base64digest!
+ Base64.strict_encode64(digest!)
+ end
end
end
diff --git a/test/digest/test_digest.rb b/test/digest/test_digest.rb
index fa12086300..8f7602743f 100644
--- a/test/digest/test_digest.rb
+++ b/test/digest/test_digest.rb
@@ -18,14 +18,22 @@ module TestDigest
Data2 = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
def test_s_hexdigest
- self.class::DATA.each do |str, digest|
- assert_equal(digest, self.class::ALGO.hexdigest(str))
+ self.class::DATA.each do |str, hexdigest|
+ assert_equal(hexdigest, self.class::ALGO.hexdigest(str))
+ end
+ end
+
+ def test_s_base64digest
+ self.class::DATA.each do |str, hexdigest|
+ digest = [hexdigest].pack("H*")
+ assert_equal([digest].pack("m0").delete("\n"), self.class::ALGO.base64digest(str))
end
end
def test_s_digest
- self.class::DATA.each do |str, digest|
- assert_equal([digest].pack("H*"), self.class::ALGO.digest(str))
+ self.class::DATA.each do |str, hexdigest|
+ digest = [hexdigest].pack("H*")
+ assert_equal(digest, self.class::ALGO.digest(str))
end
end