Algorithm-ConsistentHash-Ketama
view release on metacpan or search on metacpan
inc/Module/Install.pm view on Meta::CPAN
437438439440441442443444445446447448449450451452453454455456457sub
_version ($) {
my
$s
=
shift
|| 0;
my
$d
=()=
$s
=~ /(\.)/g;
if
(
$d
>= 2 ) {
# Normalise multipart versions
$s
=~ s/(\.)(\d{1,3})/
sprintf
(
"$1%03d"
,$2)/eg;
}
$s
=~ s/^(\d+)\.?//;
my
$l
= $1 || 0;
my
@v
=
map
{
$_
.
'0'
x (3 -
length
$_
)
}
$s
=~ /(\d{1,3})\D?/g;
$l
=
$l
.
'.'
.
join
''
,
@v
if
@v
;
return
$l
+ 0;
}
sub
_cmp ($$) {
_version(
$_
[1]) <=> _version(
$_
[2]);
}
# Cloned from Params::Util::_CLASS
inc/Module/Install/Makefile.pm view on Meta::CPAN
150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
for
my
$subdir
(
@_
) {
push
@$subdirs
,
$subdir
;
}
}
sub
clean_files {
my
$self
=
shift
;
my
$clean
=
$self
->makemaker_args->{clean} ||= {};
%$clean
= (
%$clean
,
FILES
=>
join
' '
,
grep
{
length
$_
} (
$clean
->{FILES} || (),
@_
),
);
}
sub
realclean_files {
my
$self
=
shift
;
my
$realclean
=
$self
->makemaker_args->{realclean} ||= {};
%$realclean
= (
%$realclean
,
FILES
=>
join
' '
,
grep
{
length
$_
} (
$realclean
->{FILES} || (),
@_
),
);
}
sub
libs {
my
$self
=
shift
;
my
$libs
=
ref
$_
[0] ?
shift
: [
shift
];
$self
->makemaker_args(
LIBS
=>
$libs
);
}
sub
inc {
xs/KetamaMD5.c view on Meta::CPAN
323324325326327328329330331332333334335336337338339340341342343md5_append(md5_state_t
*pms
, const md5_byte_t
*data
,
int
nbytes)
{
const md5_byte_t
*p
= data;
int
left = nbytes;
int
offset = (pms->count[0] >> 3) & 63;
md5_word_t nbits = (md5_word_t)(nbytes << 3);
if
(nbytes <= 0)
return
;
/* Update the message
length
. */
pms->count[1] += nbytes >> 29;
pms->count[0] += nbits;
if
(pms->count[0] < nbits)
pms->count[1]++;
/* Process an initial partial block. */
if
(offset) {
int
copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
memcpy(pms->buf + offset, p, copy);
xs/KetamaMD5.c view on Meta::CPAN
362363364365366367368369370371372373374375376377378379380381{
static const md5_byte_t pad[64] = {
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
md5_byte_t data[8];
int
i;
/* Save the
length
before
padding. */
for
(i = 0; i < 8; ++i)
data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
/* Pad to 56 bytes mod 64. */
md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
/* Append the
length
. */
md5_append(pms, data, 8);
for
(i = 0; i < 16; ++i)
digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
}
xs/KetamaMD5.h view on Meta::CPAN
585960616263646566676869707172737475767778* CPUs;
if
ARCH_IS_BIG_ENDIAN is not
defined
, the code will be compiled to
* run on either big- or little-endian CPUs, but will run slightly less
* efficiently on either one than
if
ARCH_IS_BIG_ENDIAN is
defined
.
*/
typedef unsigned char md5_byte_t; /* 8-bit byte */
typedef unsigned
int
md5_word_t; /* 32-bit word */
/* Define the state of the MD5 Algorithm. */
typedef struct md5_state_s {
md5_word_t count[2]; /* message
length
in bits, lsw first */
md5_word_t abcd[4]; /* digest buffer */
md5_byte_t buf[64]; /* accumulate block */
} md5_state_t;
#ifdef __cplusplus
extern
"C"
{
#endif
/* Initialize the algorithm. */
( run in 0.364 second using v1.01-cache-2.11-cpan-95122f20152 )