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 }
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; } } } } }