Hi

Wouldn't the fact that you use hash cause potential loops now? e.g. collection 
refers to another object that refers to first collection. --> aCollection>>hash 
references an item which causes this current collection's hash to be called 
again?

identityHash is deterministic in this case.

Does this help?
Cheers
Carlo

On 12 Dec 2011, at 10:58 AM, Mariano Martinez Peck wrote:

Hi guys. I hope this is not a very stupid question. Background: in Fuel we have 
a IdentityDictionary where we put each of the objects we find while traversing 
the graph. We need to use IdentitySet because we cannot have repetitions (and 
to avoid loops) so we NEED to use #==. In such dictionary we put ALL objects of 
the graph, so it can be very big. Since IdentitySet uses #identityHash, it 
means it will be using those ONLY 12 bits in the object header. It means that 
we have 2^12 = 4096  different values.  

Question:  having explained the previous, I wanted to be able to use #hash 
rather than #identityHash since several classes implement #hash and hence I 
thought that using #hash I could have less colisions and hence a better 
performance. I tried to make a subclass of IdentitySet that uses #hash rather 
than #identityHash but my image freezes. I also tried something like:

set := PluggableSet new.
    set hashBlock: [ :elem | elem hash ].
    set equalBlock: [ :a :b | a == b ].

But it doesn't work either. I works with simple tests in a workspace but when I 
run the full tests of Fuel, it enters in a loop in the method #hash of 
Collection..

Anyway, my question is, should that work? if not, what is the exact reason?

Thanks in advance,

-- 
Mariano
http://marianopeck.wordpress.com


Reply via email to