From: "Simon Kröger" Date: 2006-03-20T23:20:47+09:00 Subject: Re: Digest::Base 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