Algorithm-ConsistentHash-JumpHash
view release on metacpan or search on metacpan
JumpHash.xs view on Meta::CPAN
for ( ; in != end; in += 8 )
{
m = U8TO64_LE( in );
v3 ^= m;
SIPROUND;
SIPROUND;
v0 ^= m;
}
switch( left )
{
case 7: b |= ( ( uint64_t )in[ 6] ) << 48;
case 6: b |= ( ( uint64_t )in[ 5] ) << 40;
case 5: b |= ( ( uint64_t )in[ 4] ) << 32;
case 4: b |= ( ( uint64_t )in[ 3] ) << 24;
case 3: b |= ( ( uint64_t )in[ 2] ) << 16;
case 2: b |= ( ( uint64_t )in[ 1] ) << 8;
case 1: b |= ( ( uint64_t )in[ 0] ); break;
case 0: break;
}
v3 ^= b;
SIPROUND;
SIPROUND;
v0 ^= b;
v2 ^= 0xff;
SIPROUND;
SIPROUND;
SIPROUND;
SIPROUND;
b = v0 ^ v1 ^ v2 ^ v3;
return b;
/*return (U32)(b & U32_MAX);*/
}
int32_t
JumpConsistentHash(uint64_t key, int32_t num_buckets)
{
int64_t b = 1;
int64_t j = 0;
while (j < num_buckets) {
b = j;
key = key * 2862933555777941757ULL + 1;
j = (b + 1) * ((double)(1LL << 31) / (double)((key >> 33) + 1));
}
return b;
}
MODULE = Algorithm::ConsistentHash::JumpHash PACKAGE = Algorithm::ConsistentHash::JumpHash
PROTOTYPES: DISABLE
int32_t
jumphash_numeric(uint64_t key, int32_t num_buckets)
CODE:
RETVAL = JumpConsistentHash(key, num_buckets);
OUTPUT: RETVAL
int32_t
jumphash_siphash(SV *str, uint64_t num_buckets)
CODE:
{
STRLEN len;
/* FIXME */
const char * strval = SvPVbyte(str, len);
const uint64_t hashval = siphash_2_4_from_perl(strval, len);
RETVAL = JumpConsistentHash(hashval, num_buckets);
}
OUTPUT: RETVAL
( run in 0.864 second using v1.01-cache-2.11-cpan-13bb782fe5a )