static inline ulong zend_inline_hash_func(char *arKey, uint nKeyLength) |
{ |
register ulong hash = 5381; |
|
/* variant with the hash unrolled eight times */ |
for (; nKeyLength >= 8; nKeyLength -= 8) { |
hash = ((hash << 5) + hash) + *arKey++; |
hash = ((hash << 5) + hash) + *arKey++; |
hash = ((hash << 5) + hash) + *arKey++; |
hash = ((hash << 5) + hash) + *arKey++; |
hash = ((hash << 5) + hash) + *arKey++; |
hash = ((hash << 5) + hash) + *arKey++; |
hash = ((hash << 5) + hash) + *arKey++; |
hash = ((hash << 5) + hash) + *arKey++; |
} |
switch (nKeyLength) { |
case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ |
case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ |
case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ |
case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ |
case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ |
case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ |
case 1: hash = ((hash << 5) + hash) + *arKey++; break ; |
case 0: break ; |
EMPTY_SWITCH_DEFAULT_CASE() |
} |
return hash; |
} |
hashing function used in Perl 5.005: |
# Return the hashed value of a string: $hash = perlhash( "key" ) |
# (Defined by the PERL_HASH macro in hv.h) |
sub perlhash |
{ |
$hash = 0; |
foreach (split //, shift) { |
$hash = $hash *33 + ord( $_ ); |
} |
return $hash ; |
} |