From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

package Acrux::Digest;
use strict;
use utf8;
=encoding utf-8
=head1 NAME
Acrux::Digest - Acrux Digest base class
=head1 SYNOPSIS
use parent qw/Acrux::Digest/;
=head1 DESCRIPTION
Acrux Digest base class
=head2 new
my $provider = Acrux::Digest::Provider->new();
Returns Digest Provider instance
=head1 ATTRIBUTES
This class implements the following attributes
=head2 data
my $data = $provider->data;
$provider = $provider->data({foo => 'bar'});
Data structure to be processed
=head1 METHODS
This class implements the following methods
=head2 add
$provider->add("data", "and another data", ...);
Add data to digest calculate.
All specified data of array will be concatenated to one pool of data
=head2 addfile
$provider->addfile("/path/of/file");
Add file content to data pool
$provider->addfile(*STDIN);
Add STDIN content to data pool
=head2 digest
my $digest = $provider->digest;
Returns result digest (as is)
=head2 hexdigest
my $digest = $provider->hexdigest;
Returns sesult digest as hex string
=head2 b64digest, base64digest
my $digest = $provider->b64digest;
Returns sesult digest as b64 string
=head2 reset
$provider->reset;
Reset data (set to "")
=head1 HISTORY
See C<Changes> file
=head1 TO DO
See C<TODO> file
=head1 SEE ALSO
L<Digest>
=head1 AUTHOR
Serż Minus (Sergey Lepenkov) L<https://www.serzik.com> E<lt>abalama@cpan.orgE<gt>
=head1 COPYRIGHT
Copyright (C) 1998-2024 D&D Corporation. All Rights Reserved
=head1 LICENSE
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
See C<LICENSE> file and L<https://dev.perl.org/licenses/>
=cut
our $VERSION = '0.01';
use constant {
BUFFER_SIZE => 4*1024, # 4kB
};
use Carp;
sub new {
my $class = shift;
return bless {
data => '',
}, $class;
}
sub data {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{data} = shift;
return $self;
}
return $self->{data};
}
sub add {
my $self = shift;
$self->{data} .= join('', @_);
return $self;
}
sub addfile {
my $self = shift;
my $fh = shift;
return $self unless $fh;
if (!ref($fh) && ref(\$fh) ne "GLOB") {
$fh = IO::File->new($fh, "r");
return $self unless $fh;
}
$fh->binmode() or croak(sprintf("Can't switch to binmode: %s", $!));
my $buf;
while ($fh->read($buf, BUFFER_SIZE)) {
$self->add($buf);
}
$fh->close() or croak(sprintf("Can't close file: %s", $!));
return $self;
}
sub reset {
my $self = shift;
$self->{data} = "";
return $self;
}
sub hexdigest {
my $self = shift;
return unpack("H*", $self->digest(@_));
}
sub base64digest {
my $self = shift;
return encode_base64($self->digest(@_), "");
}
sub b64digest { goto &base64digest }
sub digest { croak 'Method "digest" not implemented by subclass' };
1;
__END__