Algorithm-HyperLogLog
view release on metacpan or search on metacpan
lib/Algorithm/HyperLogLog/PP.pm view on Meta::CPAN
package Algorithm::HyperLogLog::PP;
use strict;
use warnings;
use 5.008008;
use Carp ();
use Digest::MurmurHash3::PurePerl qw(murmur32);
use constant {
HLL_HASH_SEED => 313,
TWO_32 => 4294967296.0,
NEG_TWO_32 => -4294967296.0,
};
our $VERSION = "0.24";
require Algorithm::HyperLogLog;
{
package Algorithm::HyperLogLog;
our @ISA = qw(Algorithm::HyperLogLog::PP);
}
sub new {
my ( $class, $k ) = @_;
if ( $k < 4 || $k > 16 ) {
Carp::croak "Number of ragisters must be in the range [4,16]";
}
my $m = 1 << $k;
my $registers = [ (0) x $m ];
my $alpha = 0;
if ( $m == 16 ) {
$alpha = 0.673;
}
elsif ( $m == 32 ) {
$alpha = 0.697;
}
elsif ( $m == 64 ) {
$alpha = 0.709;
}
else {
$alpha = 0.7213 / ( 1.0 + 1.079 / $m );
}
my $self = {
k => $k,
m => $m,
registers => $registers,
alphaMM => $alpha * $m * $m,
};
bless $self, $class;
return $self;
}
sub _new_from_dump {
my ( $class, $k, $data ) = @_;
my $self = $class->new($k);
$self->{registers} = $data;
return $self;
}
sub _dump_register {
my $self = shift;
return $self->{registers};
}
sub register_size {
my $self = shift;
return $self->{m};
}
sub add {
( run in 1.304 second using v1.01-cache-2.11-cpan-39bf76dae61 )