public Hashdeck(int capacity = 16, HashBits bits = HashBits.bit64) : base(bits) { size = capacity; minSize = capacity; table = EmptyCardTable(capacity); first = EmptyCard(); last = first; mixMask = Submix.Mask((ulong)capacity); msbId = Submix.MsbId(capacity); }
private void rehashAndReindex(Card <V>[] newcardTable, Card <V>[] newcardList, int newsize) { int _conflicts = 0; int _counter = 0; int total = count + removed; ulong newMixMask = Submix.Mask((ulong)newsize); int newMsbId = Submix.MsbId(newsize); Card <V> card = null; Card <V> mem = null; for (int i = 0; i < total; i++) { card = list[i]; if (card != null && !card.Removed) { ulong pos = getPosition(card.Key, newsize, newMixMask, newMsbId); mem = newcardTable[pos]; if (mem == null) { card.Extent = null; card.Index = _counter; newcardTable[pos] = card; newcardList[_counter++] = card; } else { for (; ;) { if (mem.Extent == null) { card.Extent = null; mem.Extent = card; card.Index = _counter; newcardList[_counter++] = card; _conflicts++; break; } else { mem = mem.Extent; } } } } } conflicts = _conflicts; removed = 0; mixMask = newMixMask; msbId = newMsbId; }