Re: last Rehash()

Fons Rademakers (Fons.Rademakers@cern.ch)
Thu, 29 Apr 1999 14:13:54 +0000


Hi Valeri,

this bug has already been fixed in our development version. A work around
is to set in your .rootrc: Root.ObjectStat: 1.

Or to apply the following fix to the CONT_HashTable.cxx file,
in "THashTable::Rehash()" change the line:

if (checkObjValidity && gObjectTable) {

to

if (checkObjValidity && TObject::GetObjectStat() && gObjectTable) {

Cheers, Fons.

Tioukov Valeri wrote:
>
> Hi rooters,
>
> I found that the last Rehash() of the hashtable othen is really last: the
> table becomes broken.
>
> As the shortest example Test_THashTable from tcollex.cxx with 4 edited
> lines (marked VT:) :
>
> .................................................................................
> void Test_THashTable()
> {
> Printf(
> "////////////////////////////////////////////////////////////////\n"
> "// Test of THashTable //\n"
> "////////////////////////////////////////////////////////////////"
> );
>
> int i;
>
> // Create a hash table with an initial size of 20 (actually the nextprime
> // above 20). No automatic rehashing.
> THashTable ht(20);
>
> Printf("Filling THashTable");
> Printf("Number of slots before filling: %d", ht.Capacity());
> for (i = 0; i < 100; i++) // VT: change loop to 100
> ht.Add(new TObjNum(i)); // VT: TObjNum instead TObject
>
> ht.Print(); // VT: printed ok
>
> Printf("Average collisions: %f", ht.AverageCollisions());
>
> // rehash the hash table to reduce the collission rate
> ht.Rehash(ht.GetSize());
>
> ht.Print(); // VT: print 1 empty line
>
> Printf("Number of slots after rehash: %d", ht.Capacity());
> Printf("Average collisions after rehash: %f", ht.AverageCollisions());
> ................................................................................
>
> In fact after the last rehash nothing works also in my programs.
> Moreother if I declare table with the automatic rehash
> THashTable ht(100,10); for example - the effect depends dramatically on
> the parameters
>
> The next code I add to tcollex.cxx as one more example:
>
> void Test_T()
> {
> TObjNum *x=0, *y=0;
>
> THashTable *h = new THashTable(100,10);
>
> for(int i=0; i<2000; i++) {
> x = new TObjNum(i);
> h->Add(x);
> }
>
> y = new TObjNum(10);
> ((TObjNum*)h->FindObject(y))->Print(""); // 1
>
> printf("%f \n", h->AverageCollisions());
> h->Rehash(h->GetSize());
> printf("%f \n", h->AverageCollisions());
>
> h->Print(); // 2
> ((TObjNum*)h->FindObject(y))->Print(""); // 3
> }
>
> This code brakes at line // 1 . If one change the table declaration to
> THashTable(100,20); or reduce the cycle to 200 - it works up to line //2.
> Line //3 brakes anyway.
>
> Is it a bug or I do something wrong?
> I tested it only on one system RH5.2+egcs-1.0.3
>
> Best regards
> Valeri

-- 
Org:    CERN, European Laboratory for Particle Physics.
Mail:   1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248
WWW:    http://root.cern.ch/~rdm/            Fax:   +41 22 7677910