Algorithm::ConsistentHash::Ketama - Ketama Consistent Hashing for Perl (XS)
use Algorithm::ConsistentHash::Ketama; my $ketama = Algorithm::ConsistentHash::Ketama->new(); # Or # $ketama = Algorithm::ConsistentHash::Ketama->new( # use_hashfunc => Algorithm::ConsistentHash::Ketama::HASHFUNC2(), # ) # See "IMPORTANT NOTES FOR USERS OF 0.00011 AND BELOW" $ketama->add_bucket( $key1, $weight1 ); $ketama->add_bucket( $key2, $weight2 ); $ketama->add_bucket( $key3, $weight3 ); $ketama->add_bucket( $key4, $weight4 ); my $key = $ketama->hash( $thing );
WARNING: Alpha quality code -- and I wrote it for the heck of it, so no guarantees as of yet. Patches, tests welcome.
This module implements just the libketama algorithm. You can specify a list of "buckets", and then you can get the corresponding bucket name back when you hash a string.
Creates a new instance of Algorithm::ConsistentHash::Ketama
Clones the current object.
Adds a bucket to the list. $key is the name of the bucket, and $weight denotes the weight of the $key.
$key
$weight
Returns the corresponding bucket name (which you gave when you did add_bucket).
Removes the given bucket from the list
Returns a list of Algorithm::ConsistentHash::Ketama::Bucket objects
This is an advanced function. Reach for it only if you know exactly why you need it.
Returns both the label (as with the hash() function) AND the computed internal hash. This internal hash number can be used to look up the label again without recomputing the hash.
Given a number, returns the label associated with that hash number. Only hashes returned by hash_with_hashnum are permissible.
Prior to version 0.00010 of this module, there used be a integer underflow bug. which caused inconsistencies with other implementations of this algorithm.
This has been reported here: https://github.com/dgryski/go-ketama/commit/5fb0f7e85cb457c4cfb78bb892d02434d9f0620b
The underflow should be fixed, but because this changes the hashing behavior for some keys and you may have already filled your cache with important data already, the old behavior is preserved by default.
If you would like to switch to the new behavior, you may do one of the following:
# Change the behavior for this particular instance of A::C::Ketama: my $ketama = Algorithm::ConsistentHash::Ketama->new( use_hashfunc => Algorithm::ConsistentHash::Ketama::HASHFUNC2(), ); # Globally change the behavior local $Algorithm::ConsistentHash::Ketama::DEFAULT_HASHFUNC = Algorithm::ConsistentHash::Ketama::HASHFUNC2(); my $ketama = Algorithm::ConsistentHash::Ketama->new();
Portions of this distribution are derived from libketama, which is:
Copyright (C) 2007 by Christian Muehlhaeuser C<< <chris@last.fm> >> Richard Jones C<< <rj@last.fm> >>
Affected portions are licensed under GPL v2.
The rest of the code which is written by Daisuke Maki are available under Artistic License v2, and is:
Copyright (C) 2010 Daisuke Maki C<< <daisuke@endeworks.jp> >>
Please see the file xs/Ketama.xs for more detail.
To install Algorithm::ConsistentHash::Ketama, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Algorithm::ConsistentHash::Ketama
CPAN shell
perl -MCPAN -e shell install Algorithm::ConsistentHash::Ketama
For more information on module installation, please visit the detailed CPAN module installation guide.