The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

use strict;
use utf8;
=encoding utf-8
=head1 NAME
Acrux::Digest::FNV32a - FNV32a Digest calculation for short strings
=head1 SYNOPSIS
use Acrux::Digest::FNV32a;
my $fnv32a = Acrux::Digest::FNV32a->new();
my $digest = $fnv32a->digest( "123456789" ); # 0xbb86b11c
my $hexdigest = $fnv32a->digest( "123456789" ); # bb86b11c
=head1 DESCRIPTION
This is Digest backend module that provides calculate FNV32a Digest for short strings
=head1 METHODS
This class inherits all methods from L<Acrux::Digest> and implements the following new ones
=head2 digest
my $digest = $fnv32a->digest( "123456789" ); # 0xbb86b11c
Returns FNV32a Digest
=head2 hexdigest
my $hexdigest = $fnv32a->digest( "123456789" ); # bb86b11c
Returns FNV32a Digest in hex form
=head1 HISTORY
See C<Changes> file
=head1 TO DO
See C<TODO> file
=head1 SEE ALSO
L<Acrux::Digest>, L<Digest::FNV::PurePerl>,
=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';
sub digest {
my $self = shift;
my $data = shift;
$self->data($data) if defined $data;
my $string = $self->data;
my $hval = 0x811c9dc5;
if ((1<<32) == 4294967296) {
foreach my $c (unpack('C*', $string)) {
$hval ^= $c;
$hval += ((($hval << 1)) + (($hval << 4)) + (($hval << 7)) + (($hval << 8)) + (($hval << 24)));
$hval = $hval & 0xffffffff;
}
} else {
use bigint;
foreach my $c (unpack('C*', $string)) {
$hval ^= $c;
$hval += ((($hval << 1)) + (($hval << 4)) + (($hval << 7)) + (($hval << 8)) + (($hval << 24)));
$hval = $hval & 0xffffffff;
}
}
return $hval;
}
sub hexdigest {
my $self = shift;
return sprintf("%x", $self->digest(@_));
}
1;
__END__