#define PERL_HASH_FUNC_MURMUR3
#define PERL_HASH_FUNC_SIPHASH
#define PERL_HASH_FUNC_ONE_AT_A_TIME
+#define PERL_HASH_FUNC_ONE_AT_A_TIME_OLD
#define PERL_HASH_FUNC_BUZZHASH16
*/
-#if !(defined(PERL_HASH_FUNC_SDBM) || defined(PERL_HASH_FUNC_DJB2) || defined(PERL_HASH_FUNC_SUPERFAST) \
- || defined(PERL_HASH_FUNC_MURMUR3) || defined(PERL_HASH_FUNC_ONE_AT_A_TIME) || defined(PERL_HASH_FUNC_BUZZHASH16))
-#define PERL_HASH_FUNC_MURMUR3
+#if !( 0 \
+ || defined(PERL_HASH_FUNC_SDBM) \
+ || defined(PERL_HASH_FUNC_DJB2) \
+ || defined(PERL_HASH_FUNC_SUPERFAST) \
+ || defined(PERL_HASH_FUNC_MURMUR3) \
+ || defined(PERL_HASH_FUNC_ONE_AT_A_TIME) \
+ || defined(PERL_HASH_FUNC_ONE_AT_A_TIME_OLD) \
+ || defined(PERL_HASH_FUNC_BUZZHASH16) \
+ )
+#ifdef U64
+#define PERL_HASH_FUNC_SIPHASH
+#else
+#define PERL_HASH_FUNC_ONE_AT_A_TIME
+#endif
#endif
#if defined(PERL_HASH_FUNC_BUZZHASH16)
#define PERL_HASH(hash,str,len) \
STMT_START { \
- register const char * const s_PeRlHaSh_tmp = (str); \
- register const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; \
- register const unsigned char *end_PeRlHaSh = (const unsigned char *)s_PeRlHaSh + len; \
- register U32 hash_PeRlHaSh = (PERL_HASH_SEED_U16_x(len & 0xff) << 16) + len; \
+ const char * const s_PeRlHaSh_tmp = (str); \
+ const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; \
+ const unsigned char *end_PeRlHaSh = (const unsigned char *)s_PeRlHaSh + len; \
+ U32 hash_PeRlHaSh = (PERL_HASH_SEED_U16_x(len & 0xff) << 16) + len; \
while (s_PeRlHaSh < end_PeRlHaSh) { \
hash_PeRlHaSh ^= PERL_HASH_SEED_U16_x((U8)*s_PeRlHaSh++); \
hash_PeRlHaSh += BUZZHASH_ROTL32(hash_PeRlHaSh,11); \
#endif
#define PERL_HASH(hash,str,len) \
STMT_START { \
- register const char * const strtmp_PeRlHaSh = (str); \
- register const unsigned char *str_PeRlHaSh = (const unsigned char *)strtmp_PeRlHaSh; \
- register U32 len_PeRlHaSh = (len); \
- register U32 hash_PeRlHaSh = PERL_HASH_SEED_U32 ^ len; \
- register U32 tmp_PeRlHaSh; \
- register int rem_PeRlHaSh= len_PeRlHaSh & 3; \
+ const char * const strtmp_PeRlHaSh = (str); \
+ const unsigned char *str_PeRlHaSh = (const unsigned char *)strtmp_PeRlHaSh; \
+ U32 len_PeRlHaSh = (len); \
+ U32 hash_PeRlHaSh = PERL_HASH_SEED_U32 ^ len; \
+ U32 tmp_PeRlHaSh; \
+ int rem_PeRlHaSh= len_PeRlHaSh & 3; \
len_PeRlHaSh >>= 2; \
\
for (;len_PeRlHaSh > 0; len_PeRlHaSh--) { \
#if defined(UNALIGNED_SAFE)
#define PERL_HASH(hash,str,len) STMT_START { \
- register const char * const s_PeRlHaSh_tmp = (str); \
- register const unsigned char *PeRlHaSh_ptr = (const unsigned char *)s_PeRlHaSh_tmp; \
- register I32 PeRlHaSh_len = len; \
+ const char * const s_PeRlHaSh_tmp = (str); \
+ const unsigned char *PeRlHaSh_ptr = (const unsigned char *)s_PeRlHaSh_tmp; \
+ I32 PeRlHaSh_len = len; \
\
U32 PeRlHaSh_h1 = PERL_HASH_SEED_U32; \
U32 PeRlHaSh_k1; \
} STMT_END
#else
#define PERL_HASH(hash,str,len) STMT_START { \
- register const char * const s_PeRlHaSh_tmp = (str); \
- register const unsigned char *PeRlHaSh_ptr = (const unsigned char *)s_PeRlHaSh_tmp; \
- register I32 PeRlHaSh_len = len; \
+ const char * const s_PeRlHaSh_tmp = (str); \
+ const unsigned char *PeRlHaSh_ptr = (const unsigned char *)s_PeRlHaSh_tmp; \
+ I32 PeRlHaSh_len = len; \
\
U32 PeRlHaSh_h1 = PERL_HASH_SEED_U32; \
U32 PeRlHaSh_k1; \
#define PERL_HASH_SEED_BYTES 4
#define PERL_HASH(hash,str,len) \
STMT_START { \
- register const char * const s_PeRlHaSh_tmp = (str); \
- register const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; \
- register I32 i_PeRlHaSh = len; \
- register U32 hash_PeRlHaSh = PERL_HASH_SEED_U32 ^ len; \
+ const char * const s_PeRlHaSh_tmp = (str); \
+ const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; \
+ I32 i_PeRlHaSh = len; \
+ U32 hash_PeRlHaSh = PERL_HASH_SEED_U32 ^ len; \
while (i_PeRlHaSh--) { \
hash_PeRlHaSh = ((hash_PeRlHaSh << 5) + hash_PeRlHaSh) + *s_PeRlHaSh++; \
} \
#define PERL_HASH_SEED_BYTES 4
#define PERL_HASH(hash,str,len) \
STMT_START { \
- register const char * const s_PeRlHaSh_tmp = (str); \
- register const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; \
- register I32 i_PeRlHaSh = len; \
- register U32 hash_PeRlHaSh = PERL_HASH_SEED_U32 ^ len; \
+ const char * const s_PeRlHaSh_tmp = (str); \
+ const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; \
+ I32 i_PeRlHaSh = len; \
+ U32 hash_PeRlHaSh = PERL_HASH_SEED_U32 ^ len; \
while (i_PeRlHaSh--) { \
hash_PeRlHaSh = (hash_PeRlHaSh << 6) + (hash_PeRlHaSh << 16) - hash_PeRlHaSh + *s_PeRlHaSh++; \
} \
(hash) = hash_PeRlHaSh;\
} STMT_END
-#elif defined(PERL_HASH_FUNC_ONE_AT_A_TIME)
-/* DEFAULT/HISTORIC HASH FUNCTION */
-#define PERL_HASH_FUNC "ONE_AT_A_TIME"
+#elif defined(PERL_HASH_FUNC_ONE_AT_A_TIME) || defined(PERL_HASH_FUNC_ONE_AT_A_TIME_OLD)
+
#define PERL_HASH_SEED_BYTES 4
+#ifdef PERL_HASH_FUNC_ONE_AT_A_TIME
+/* new version, add the length to the seed so that adding characters changes the "seed" being used. */
+#define PERL_HASH_FUNC "ONE_AT_A_TIME"
+#define MIX_SEED_AND_LEN(seed,len) (seed + len)
+#else
+/* old version, just use the seed. - not recommended */
+#define PERL_HASH_FUNC "ONE_AT_A_TIME_OLD"
+#define MIX_SEED_AND_LEN(seed,len) (seed)
+#endif
+
/* FYI: This is the "One-at-a-Time" algorithm by Bob Jenkins
* from requirements by Colin Plumb.
* (http://burtleburtle.net/bob/hash/doobs.html) */
#define PERL_HASH(hash,str,len) \
STMT_START { \
- register const char * const s_PeRlHaSh_tmp = (str); \
- register const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; \
- register I32 i_PeRlHaSh = len; \
- register U32 hash_PeRlHaSh = PERL_HASH_SEED_U32 ^ len; \
- while (i_PeRlHaSh--) { \
+ const char * const s_PeRlHaSh_tmp = (str); \
+ const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; \
+ const unsigned char *end_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp + (len); \
+ U32 hash_PeRlHaSh = MIX_SEED_AND_LEN(PERL_HASH_SEED_U32, len); \
+ while (s_PeRlHaSh < end_PeRlHaSh) { \
hash_PeRlHaSh += (U8)*s_PeRlHaSh++; \
hash_PeRlHaSh += (hash_PeRlHaSh << 10); \
hash_PeRlHaSh ^= (hash_PeRlHaSh >> 6); \