Esempio n. 1
0
 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;
        }