--- parser3/src/include/pa_inline_hash.h 2026/04/30 01:40:39 1.5 +++ parser3/src/include/pa_inline_hash.h 2026/05/28 14:29:56 1.8 @@ -8,19 +8,20 @@ #ifndef PA_INLINE_HASH_H #define PA_INLINE_HASH_H -#define IDENT_PA_INLINE_HASH_H "$Id: pa_inline_hash.h,v 1.5 2026/04/30 01:40:39 moko Exp $" +#define IDENT_PA_INLINE_HASH_H "$Id: pa_inline_hash.h,v 1.8 2026/05/28 14:29:56 moko Exp $" #include "pa_hash.h" -#define PA_INLINE_HASH_N 13 +#define PA_INLINE_HASH_N 13 // Low overflow rate, high first-hit ratio +#define PA_PROBE_LIMIT 8 // Prevents long probe chains from degrading the inline table // Linear-probing inline hash with PA_INLINE_HASH_N slots before overflow to HashString. -// Inits 8*N bytes, while HASH allocates (and inits) at least template class InlineHashString: public PA_Object { public: - InlineHashString() : fkeys{}, foverflow(0) { + InlineHashString() : foverflow(0) { + memset(fkeys, 0, sizeof(fkeys)); } ~InlineHashString() { @@ -38,7 +39,7 @@ public: if(!fkeys[i]) return 0; // NULL implies foverflow==NULL if(fkeys[i]->get_hash_code() == hash && *fkeys[i] == nb) return fvalues[i]; // Сollision - for(int n = 0; n < PA_INLINE_HASH_N-1; n++) { + for(int n = 0; n < PA_PROBE_LIMIT-1; n++) { if(++i >= PA_INLINE_HASH_N) i = 0; if(!fkeys[i]) return 0; if(fkeys[i]->get_hash_code() == hash && *fkeys[i] == nb) return fvalues[i]; @@ -55,7 +56,7 @@ public: if(!fkeys[i]) { fkeys[i] = &nb; fvalues[i] = value; return false; } if(fkeys[i]->get_hash_code() == hash && *fkeys[i] == nb) { fvalues[i] = value; return true; } // Сollision - for(int n = 0; n < PA_INLINE_HASH_N-1; n++) { + for(int n = 0; n < PA_PROBE_LIMIT-1; n++) { if(++i >= PA_INLINE_HASH_N) i = 0; if(!fkeys[i]) { fkeys[i] = &nb; fvalues[i] = value; return false; } if(fkeys[i]->get_hash_code() == hash && *fkeys[i] == nb) { fvalues[i] = value; return true; } @@ -74,7 +75,7 @@ public: if(!fkeys[i]) return false; if(fkeys[i]->get_hash_code() == hash && *fkeys[i] == nb) { fvalues[i] = value; return true; } // Сollision - for(int n = 0; n < PA_INLINE_HASH_N-1; n++) { + for(int n = 0; n < PA_PROBE_LIMIT-1; n++) { if(++i >= PA_INLINE_HASH_N) i = 0; if(!fkeys[i]) return false; if(fkeys[i]->get_hash_code() == hash && *fkeys[i] == nb) { fvalues[i] = value; return true; }