Daniel Harple schrieb:
> 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

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