Forum: Ruby Digest::Base

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
02bd6b98b7c04f9ae5868eda3d01fb73?d=identicon&s=25 rtilley (Guest)
on 2006-03-20 14:29
(Received via mailing list)
I wish to write one method to work with all classes in Digest::Base
without repeatedly writing the same code.

def setup(file, hash_type)

   # hash_type could be MD5, SHA1, SHA256, etc.

   Digest::hash_type.new
   Hash the file.

end

The above example is what I'd like to be able to do, but it does not
work. I cannot insert 'hash_type' into the method in this manner. Trying
to do so produces errors. I can do a bunch of conditionals like this:

def setup(file, hash_type)

   if hash_type == MD5
     Digest::MD5.new
     Hash the file.

   elsif hash_type == RMD160
     Digest::RMD160.new
     Hash the file.

   else....
     ....

end

But then, I begin repeating myself. Any tips on making this work with
fewer lines of code?

Thanks!
B33ea5c12d767bfd1253940a960274f5?d=identicon&s=25 rmagick@gmail.com (Guest)
on 2006-03-20 14:53
(Received via mailing list)
Check out Module#const_get in ri:

Digest.const_get('MD5').new
9358cc96c46055cd68d4a76a9aefe026?d=identicon&s=25 Daniel Harple (Guest)
on 2006-03-20 14:56
(Received via mailing list)
On Mar 20, 2006, at 2:28 PM, rtilley wrote:
> I wish to write one method to work with all classes in Digest::Base
> without repeatedly writing the same code.

How about this:

$ cat digest.rb
require 'digest/md5'
require 'digest/sha1'
require 'digest/sha2'
require 'digest/rmd160'

def hash_file(file, hash_kind)
   digest = Digest.const_get(hash_kind.to_s.upcase).new
   open(file, 'rb') do |f|
     while (chunk = f.read(1))
       digest.update(chunk)
     end
   end
   digest
end

puts "RMD160: #{hash_file(__FILE__, :rmd160)}"
puts "MD5:    #{hash_file(__FILE__, :md5)}"
puts "SHA1:   #{hash_file(__FILE__, :sha1)}"
puts "SHA256: #{hash_file(__FILE__, :sha256)}"

$ ruby digest.rb
RMD160: a99c2c1919b289412a98dc4562598d904e2a5750
MD5:    0a35b2d64cc5201314b691f3c8588ac6
SHA1:   f47b890ec66801e1f24956214d8a6f13c7f8daac
SHA256: bda670c53c5ff548a88f274ce17493adc0c229e32c221990e0c779c881425886

-- Daniel
02bd6b98b7c04f9ae5868eda3d01fb73?d=identicon&s=25 rtilley (Guest)
on 2006-03-20 14:58
(Received via mailing list)
rmagick@gmail.com wrote:
> Check out Module#const_get in ri:
>
> Digest.const_get('MD5').new

That's great... Thanks for the tip!
A9c4658e9e475e13d790ae419acf01b6?d=identicon&s=25 Simon Kröger (Guest)
on 2006-03-20 15:20
(Received via mailing list)
Daniel Harple schrieb:
> require 'digest/rmd160'
>
>
> -- Daniel

Quite nice. However i think const_get isn't necessary here and should be
avoided if possible. e.g.:

def hash_file(file, hash_kind)
  digest, chunk = hash_kind.new, ''
  open(file, 'rb') do |f|
    digest << chunk while f.read(4096, chunk)
  end
  digest
end

puts "RMD160: #{hash_file(__FILE__, Digest::RMD160)}"
puts "MD5:    #{hash_file(__FILE__, Digest::MD5)}"
puts "SHA1:   #{hash_file(__FILE__, Digest::SHA1)}"
puts "SHA256: #{hash_file(__FILE__, Digest::SHA256)}"

cheers

Simon
This topic is locked and can not be replied to.