-PERL_STATIC_INLINE U32
-S_perl_hash_djb2(const unsigned char * const seed, const unsigned char *str, const STRLEN len) {
- const unsigned char * const end = (const unsigned char *)str + len;
- U32 hash = *((U32*)seed) + (U32)len;
- while (str < end) {
- hash = ((hash << 5) + hash) + *str++;
- }
- return hash;
-}
-
-PERL_STATIC_INLINE U32
-S_perl_hash_sdbm(const unsigned char * const seed, const unsigned char *str, const STRLEN len) {
- const unsigned char * const end = (const unsigned char *)str + len;
- U32 hash = *((U32*)seed) + (U32)len;
- while (str < end) {
- hash = (hash << 6) + (hash << 16) - hash + *str++;
- }
- return hash;
-}
-
-/* - ONE_AT_A_TIME_HARD is the 5.17+ recommend ONE_AT_A_TIME algorithm
- * - ONE_AT_A_TIME_OLD is the unmodified 5.16 and older algorithm
- * - ONE_AT_A_TIME is a 5.17+ tweak of ONE_AT_A_TIME_OLD to
- * prevent strings of only \0 but different lengths from colliding
- *
- * Security-wise, from best to worst,
- * ONE_AT_A_TIME_HARD > ONE_AT_A_TIME > ONE_AT_A_TIME_OLD
- * There is a big drop-off in security between ONE_AT_A_TIME_HARD and
- * ONE_AT_A_TIME
- * */
-
-/* This is the "One-at-a-Time" algorithm by Bob Jenkins
- * from requirements by Colin Plumb.
- * (http://burtleburtle.net/bob/hash/doobs.html)
- * With seed/len tweak.
- * */
-PERL_STATIC_INLINE U32
-S_perl_hash_one_at_a_time(const unsigned char * const seed, const unsigned char *str, const STRLEN len) {
- const unsigned char * const end = (const unsigned char *)str + len;
- U32 hash = *((U32*)seed) + (U32)len;
- while (str < end) {
- hash += *str++;
- hash += (hash << 10);
- hash ^= (hash >> 6);
- }
- hash += (hash << 3);
- hash ^= (hash >> 11);
- return (hash + (hash << 15));
-}
-
-/* Derived from "One-at-a-Time" algorithm by Bob Jenkins */
-PERL_STATIC_INLINE U32
-S_perl_hash_one_at_a_time_hard(const unsigned char * const seed, const unsigned char *str, const STRLEN len) {
- const unsigned char * const end = (const unsigned char *)str + len;
- U32 hash = *((U32*)seed) + (U32)len;
-
- while (str < end) {
- hash += (hash << 10);
- hash ^= (hash >> 6);
- hash += *str++;
- }
-
- hash += (hash << 10);
- hash ^= (hash >> 6);
- hash += seed[4];
-
- hash += (hash << 10);
- hash ^= (hash >> 6);
- hash += seed[5];
-
- hash += (hash << 10);
- hash ^= (hash >> 6);
- hash += seed[6];
-
- hash += (hash << 10);
- hash ^= (hash >> 6);
- hash += seed[7];
-
- hash += (hash << 10);
- hash ^= (hash >> 6);
-
- hash += (hash << 3);
- hash ^= (hash >> 11);
- return (hash + (hash << 15));
-}
-
-PERL_STATIC_INLINE U32
-S_perl_hash_old_one_at_a_time(const unsigned char * const seed, const unsigned char *str, const STRLEN len) {
- const unsigned char * const end = (const unsigned char *)str + len;
- U32 hash = *((U32*)seed);
- while (str < end) {
- hash += *str++;
- hash += (hash << 10);
- hash ^= (hash >> 6);
- }
- hash += (hash << 3);
- hash ^= (hash >> 11);
- return (hash + (hash << 15));
-}
-
-#ifdef PERL_HASH_FUNC_MURMUR_HASH_64A
-/* This code is from Austin Appleby and is in the public domain.
- Altered by Yves Orton to match Perl's hash interface, and to
- return a 32 bit hash.
-
- Note uses unaligned 64 bit loads - will NOT work on machines with
- strict alignment requirements.
-
- Also this code may not be suitable for big-endian machines.
-*/
-
-/* a 64 bit hash where we only use the low 32 bits */
-PERL_STATIC_INLINE U32
-S_perl_hash_murmur_hash_64a (const unsigned char * const seed, const unsigned char *str, const STRLEN len)
-{
- const U64TYPE m = UINT64_C(0xc6a4a7935bd1e995);
- const int r = 47;
- U64TYPE h = *((U64TYPE*)seed) ^ len;
- const U64TYPE * data = (const U64TYPE *)str;
- const U64TYPE * end = data + (len/8);
- const unsigned char * data2;
-
- while(data != end)
- {
- U64TYPE k = *data++;
-
- k *= m;
- k ^= k >> r;
- k *= m;
-
- h ^= k;
- h *= m;
- }
-
- data2 = (const unsigned char *)data;
-
- switch(len & 7)
- {
- case 7: h ^= (U64TYPE)(data2[6]) << 48; /* fallthrough */
- case 6: h ^= (U64TYPE)(data2[5]) << 40; /* fallthrough */
- case 5: h ^= (U64TYPE)(data2[4]) << 32; /* fallthrough */
- case 4: h ^= (U64TYPE)(data2[3]) << 24; /* fallthrough */
- case 3: h ^= (U64TYPE)(data2[2]) << 16; /* fallthrough */
- case 2: h ^= (U64TYPE)(data2[1]) << 8; /* fallthrough */
- case 1: h ^= (U64TYPE)(data2[0]); /* fallthrough */
- h *= m;
- };
-
- h ^= h >> r;
- h *= m;
- h ^= h >> r;
-
- /* was: return h; */
- return h & 0xFFFFFFFF;
-}
-
-#endif
-
-#ifdef PERL_HASH_FUNC_MURMUR_HASH_64B
-/* This code is from Austin Appleby and is in the public domain.
- Altered by Yves Orton to match Perl's hash interface and return
- a 32 bit value
-
- Note uses unaligned 32 bit loads - will NOT work on machines with
- strict alignment requirements.
-
- Also this code may not be suitable for big-endian machines.
-*/
-
-/* a 64-bit hash for 32-bit platforms where we only use the low 32 bits */
-PERL_STATIC_INLINE U32
-S_perl_hash_murmur_hash_64b (const unsigned char * const seed, const unsigned char *str, STRLEN len)
-{
- const U32 m = 0x5bd1e995;
- const int r = 24;
-
- U32 h1 = ((U32 *)seed)[0] ^ len;
- U32 h2 = ((U32 *)seed)[1];
-
- const U32 * data = (const U32 *)str;
-
- while(len >= 8)
- {
- U32 k1, k2;
- k1 = *data++;
- k1 *= m; k1 ^= k1 >> r; k1 *= m;
- h1 *= m; h1 ^= k1;
- len -= 4;
-
- k2 = *data++;
- k2 *= m; k2 ^= k2 >> r; k2 *= m;
- h2 *= m; h2 ^= k2;
- len -= 4;
- }
-
- if(len >= 4)
- {
- U32 k1 = *data++;
- k1 *= m; k1 ^= k1 >> r; k1 *= m;
- h1 *= m; h1 ^= k1;
- len -= 4;
- }
-
- switch(len)
- {
- case 3: h2 ^= ((unsigned char*)data)[2] << 16; /* fallthrough */
- case 2: h2 ^= ((unsigned char*)data)[1] << 8; /* fallthrough */
- case 1: h2 ^= ((unsigned char*)data)[0]; /* fallthrough */
- h2 *= m;
- };
-
- h1 ^= h2 >> 18; h1 *= m;
- h2 ^= h1 >> 22; h2 *= m;
- /*
- The following code has been removed as it is unused
- when only the low 32 bits are used. -- Yves
-
- h1 ^= h2 >> 17; h1 *= m;
-
- U64TYPE h = h1;
-
- h = (h << 32) | h2;
- */
-
- return h2;
-}
-#endif
-
-/* legacy - only mod_perl should be doing this. */
-#ifdef PERL_HASH_INTERNAL_ACCESS
-#define PERL_HASH_INTERNAL(hash,str,len) PERL_HASH(hash,str,len)
-#endif
-