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...)