http://www.perlmonks.org?node_id=760433


in reply to Re^3: elsif chain vs. dispatch
in thread elsif chain vs. dispatch

I recall that perls from 5.8.3 or so have code in place to watch out for this sort of degenerate case

I think it's the HV_MAX_LENGTH_BEFORE_SPLIT, currently set to 14.

/* hv.c */ #define HV_MAX_LENGTH_BEFORE_SPLIT 14 ... Perl_hv_common( ... ) { ... while ((counter = HeNEXT(counter))) n_links++; if (n_links > HV_MAX_LENGTH_BEFORE_SPLIT) { /* Use only the old HvKEYS(hv) > HvMAX(hv) condition t +o limit bucket splits on a rehashed hash, as we're not goin +g to split it again, and if someone is lucky (evil) enou +gh to get all the keys in one list they could exhaust our + memory as we repeatedly double the number of buckets on ev +ery entry. Linear search feels a less worse thing to do +. */ hsplit(hv); } ... }

(the comment seems to be a left-over from an ealier implementation, though...)