Re: Duplicate hashcode for different Class objects

Tony Printezis <[email protected]> Mon, 15 Dec 2008 09:45:14 -0500
Newsgroups gmane.comp.programming.garbage-collection.general
Message-ID <[email protected]>
David,

Isn't this the Agesen scheme?

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.46.477

Tony

David F. Bacon wrote:
> Yes, that's all correct.  That being said, different implementations 
> of hashcode give better or worse performance.  There are issues of 
> both the number of "significant bits" and the quality of the hash 
> (which of course gets traded off against the cost of object creation 
> or the first hash).
>
> Grove, Fink, and I had a paper in ECOOP a few years ago about how to 
> optimize hashing.  The basic idea is
>
> - assume most objects are never hashed, so don't bother generating a 
> hashcode on creation and just have two hashcode flag bits which are 
> initially 0 (also enables header compression).
>
> - if the object is hashed, use its address>>3 as the hashcode, and set 
> a "hashed" bit in the object header.
>
> - if the object is moved by the collector, set a "hashed and moved" 
> bit in the header and copy the old hash to the end of the copy of the 
> object.
>
> This allows fast object creation and fairly high quality hash codes at 
> the expense of complexity and a slightly more expensive hashCode() 
> operation.  However, you have to be careful with a generational 
> collector if the nursery is small.  One way around that would be to 
> augment the hashcode with a generation number, at the expense of a 
> couple of additional loads and adds in the hashCode() operation.
>
> We implemented this in Jikes RVM and it was a major driver in 
> modularizing the object model.  I don't know whether any of the 
> specific code is still in there.
>
> david
>
>
> On Dec 13, 2008, at 9:27 AM, David Chase wrote:
>
>> This is completely possible, especially when you have a copying 
>> collector.
>>
>> First, hashcodes are not guaranteed to be unique.
>>
>> Second, the memory address is not necessarily the hashcode.  If 
>> nothing else, there are non-random bits in object locations (an 
>> 8-byte alignment guarantees the three least significant bits are 
>> zero). It is quite reasonable to apply an extra bit of hashing to the 
>> object; either using something invariant like the address/hashcode of 
>> the class, or storing a few extra bits in the header word (say, the 
>> gc count, modulo 16) that get mixed into the hashcode.  Or, the 
>> hashcode can be stored with the object itself.  That extra hashing 
>> can cause two different addresses to yield the same hashcode.
>>
>> Third, in a copying collector, it is entirely likely that different 
>> objects allocated at different times will get cycled through the same 
>> youngspace, and the same address in the youngspace.  Thus, their 
>> address would be the same.  If you can vary the size of the 
>> youngspace, you might even be able to observe a change in the 
>> frequency of these coincident hashcodes (if you did, that would 
>> statistically confirm this hypothesis, if the frequency of collision 
>> is somewhat inversely proportional to the size of the youngspace).
>>
>> On 2008-12-13, at 5:11 AM, Unmesh joshi wrote:
>>
>>>
>>> Hi,
>>>
>>> We are facing a strange problem in our application. 
>>> getClass().hashCode() is returning same hashcode for two different 
>>> classes. My understanding is that default JDK implementation returns 
>>> Object's memory address as hashCode. Can this duplication happen 
>>> because of any GC implementation chosen? (like copying collection?). 
>>> Is there any such bug already known?
>>>
>>> This problem is intermitent on Mac OS X machines and also observed 
>>> on a linux box.
>>>
>>>
>>> Thanks,
>>> Unmesh
>>> _________________________________________________________________
>>> Wish to Marry Now? Join MSN Matrimony FREE!
>>> http://in.msn.com/matrimony
>