Michael Neumann
10/16/2004 10:21:00 AM
On Fri, Oct 15, 2004 at 12:03:17PM +0900, Nobuyoshi Nakada wrote:
> Hi,
>
> At Fri, 15 Oct 2004 00:53:37 +0900,
> Michael Neumann wrote in [ruby-talk:116637]:
> > Implementation:
> >
> > # file: digest/from_io.rb
> > class Digest::Base
> > def self.from_io(io, block_size=8*1024)
> > digest = new
> > while data = io.read(block_size)
> > digest.update(data)
> > end
> > digest
> > end
> > end
>
> Another implementation could be:
>
> def Digest::Base.from(src)
> digest = new
> src.each(&digest.method(:update))
> digest
> end
>
> This requires #each method instead of #read, do you think which
> is better?
What if #each does not return a string? Does #update work for all Ruby
objects? Personally I like #from_io more, as it's more natural how it
works.
What if #from would take more arguments, like this:
Digest.from(io, :each_chunk, blk_sz = 10000, bytes = 1_000_000)
Digest.from(io, :each_line)
This would be a far more general solution, and as simple to implement.
> > Another addition would be the raw_digest method (which of course could
> > be better implemented in C):
> >
> > require 'enumerator'
> > class Digest::Base
> > def raw_digest
> > hexdigest.to_enum(:scan, /../).map {|byte| byte.to_i(16).chr}.join
> > end
> > alias rawdigest raw_digest
> > end
>
> It is equivalent to Digest::Base#digest.
Oh, thanks.
Regards,
Michael