Bug 18687

Summary: HashSet.TrimExcess() doubles the size of the collection each time it is called
Product: [Mono] Class Libraries Reporter: Craig Minihan <craig>
Component: System.CoreAssignee: Marek Safar <masafa>
Status: RESOLVED FIXED    
Severity: normal CC: masafa, mono-bugs+mono
Priority: ---    
Version: master   
Target Milestone: Untriaged   
Hardware: PC   
OS: Linux   
Tags: Is this bug a regression?: ---
Last known good build:

Description Craig Minihan 2014-03-31 20:55:39 UTC
HashSet.TrimExcess() calls HashSet.Resize(), which calculates the new collection size as follows:

int newSize = HashPrimeNumbers.ToPrime ((table.Length << 1) | 1);

This causes the collection to double in size, exactly the opposite of the callers intention. The following test code shows the issue:

var lookup = new System.Collections.Generic.HashSet<string>();

for (int i = 0; i < 10000; i++)
{
    lookup.Add(i.ToString());
}

for (int i = 0; i < 1000; i++)
{
    lookup.TrimExcess();
}

In the second loop we blow when i=13 since the array sizes are now out of range.

I'm not sure HashSet.Clear() honors the spirit of the MS docs either since only the refs are released, the arrays remain the same size.
Comment 1 Marek Safar 2014-04-09 15:17:09 UTC
Fixed in master