anchor.diff:    for I := 1 to N do
       Result := ((Result shl 2) or (Result shr 30)) xor Ord(Value[I]);
     Result := htOleStr or (Result and $0FFFFFFF);
  -end;
  -
  -function GetHashType(VType: Word): Integer;
  -begin
  -  case VType of
  -    varEmpty:    Result := htNull;
  -    varNull:     Result := htNull;
  -    varBoolean:  Result := htBoolean;
  -    varByte:     Result := htInteger;
  -    varWord:     Result := htInteger;
  -    varShortInt: Result := htInteger;
  -    varSmallint: Result := htInteger;
  -    varInteger:  Result := htInteger;
  -    varLongWord: Result := htInt64;
  -    varInt64:    Result := htInt64;
  -{$IFDEF DELPHI2009_UP}
  -    varUInt64:   Result := htInt64;
  -{$ENDIF}
  -    varSingle:   Result := htDouble;
  -    varDouble:   Result := htDouble;
  -    varCurrency: Result := htDouble;
  -    varOleStr:   Result := htOleStr;
  -    varDate:     Result := htDate;
  -    varUnknown:  Result := htObject;
  -    varVariant:  Result := htObject;
  -  else
  -    if VType = varObject then
  -      Result := htObject
  -    else
  -      Result := htNull;
  -  end;
   end;
   
   function HashOfVariant(const Value: Variant): Integer;
  
positive.code: end;
  {$ENDIF}
  
  function THashedList.Delete(Index: Integer): Variant;
  var
    OldHashCode, NewHashCode, I, OldCount: Integer;
  begin
    OldCount := Count;
    Result := inherited Delete(Index);
    if (Index >= 0) and (Index < OldCount) then begin
      if Index < Count then begin
        OldHashCode := HashOf(Result);
        for I := Index to Count - 1 do begin
          NewHashCode := HashOf(FList[I]);
          FHashBucket.Modify(OldHashCode, NewHashCode, I);
          OldHashCode := NewHashCode;
        end;
      end;
      FHashBucket.Delete(HashOf(Result), Count);
    end;
  end;
  
  
negative.code: var
    Item: Variant;
  begin
    Item := FList[Index];
  (*
    if VarIsStr(Item) and VarIsStr(Value) then
  {$IFNDEF NEXTGEN}
      Result := WideCompareStr(Item, Value) = 0
  