示例#1
0
        public void Remove(object key)
#endif
        {
            HashPage pg = root;

            if (pg != null)
            {
                uint divisor  = 1;
                int  hashCode = key.GetHashCode();
                while (true)
                {
                    int    h     = (int)((uint)hashCode / divisor % pageSize);
                    object child = pg.items[h];
                    if (child is HashPage)
                    {
                        pg       = (HashPage)child;
                        divisor *= pageSize;
                    }
                    else
                    {
                        CollisionItem prev = null;
                        for (CollisionItem item = (CollisionItem)child; item != null; item = item.next)
                        {
                            if (item.hashCode == hashCode && item.key.Equals(key))
                            {
                                if (prev != null)
                                {
                                    prev.next = item.next;
                                    prev.Modify();
                                }
                                else
                                {
                                    pg.items[h] = item.next;
                                    pg.Modify();
                                }
                                nElems -= 1;
                                Modify();
#if USE_GENERICS
                                return(true);
#else
                                return;
#endif
                            }
                            prev = item;
                        }
                        break;
                    }
                }
            }
#if USE_GENERICS
            return(false);
#endif
        }
示例#2
0
        public void Set(object key, object obj)
        {
            int      hashCode = key.GetHashCode();
            HashPage pg       = root;

            if (pg == null)
            {
                pg = new HashPage(Storage, pageSize);
                int h = (int)((uint)hashCode % pageSize);
                pg.items[h] = new CollisionItem(key, obj, hashCode);
                root        = pg;
                nElems      = 1;
                Modify();
            }
            else
            {
                uint divisor = 1;
                while (true)
                {
                    int    h     = (int)((uint)hashCode / divisor % pageSize);
                    object child = pg.items[h];
                    if (child is HashPage)
                    {
                        pg       = (HashPage)child;
                        divisor *= pageSize;
                    }
                    else
                    {
                        CollisionItem prev = null;
                        CollisionItem last = null;
                        int           collisionChainLength = 0;
                        for (CollisionItem item = (CollisionItem)child; item != null; item = item.next)
                        {
                            if (item.hashCode == hashCode)
                            {
                                if (item.key.Equals(key))
                                {
                                    item.obj = obj;
                                    item.Modify();
                                    return;
                                }
                                if (prev == null || prev.hashCode != hashCode)
                                {
                                    collisionChainLength += 1;
                                }
                                prev = item;
                            }
                            else
                            {
                                collisionChainLength += 1;
                            }
                            last = item;
                        }
                        if (prev == null || prev.hashCode != hashCode)
                        {
                            collisionChainLength += 1;
                        }
                        if (collisionChainLength > loadFactor)
                        {
                            HashPage newPage = new HashPage(Storage, pageSize);
                            divisor *= pageSize;
                            CollisionItem next;
                            for (CollisionItem item = (CollisionItem)child; item != null; item = next)
                            {
                                next = item.next;
                                int hc = (int)((uint)item.hashCode / divisor % pageSize);
                                item.next         = (CollisionItem)newPage.items[hc];
                                newPage.items[hc] = item;
                                item.Modify();
                            }
                            pg.items[h] = newPage;
                            pg.Modify();
                            pg = newPage;
                        }
                        else
                        {
                            CollisionItem newItem = new CollisionItem(key, obj, hashCode);
                            if (prev == null)
                            {
                                prev = last;
                            }
                            if (prev != null)
                            {
                                newItem.next = prev.next;
                                prev.next    = newItem;
                                prev.Modify();
                            }
                            else
                            {
                                pg.items[h] = newItem;
                                pg.Modify();
                            }
                            nElems += 1;
                            Modify();
                            return;
                        }
                    }
                }
            }
        }