Also implied, but seldom stated, is that all values used in = and hash must 
only be set at creation, never after.
The reason is the same, keeping hashed collection usage sane;
p := Point x: 3 y: 2.
Set add: p.
"Imaginary method"
p setX: 2.
Set includes: p -> false

Cheers,
Henry

> On 26 May 2015, at 9:11 , Julien Delplanque <jul...@tamere.eu> wrote:
> 
> Thanks, I understand now :)
> 
> On 26/05/15 21:06, Carlo wrote:
>> Hi
>> 
>> Any two objects that are = must answer the same #hash value.
>> The hash is used in any of the HashedCollection's for storage and then to 
>> find the exact element the #= is used.
>> If 2 objects are #= but their hash values are different the HashedCollection 
>> will not find the correct storage slot and you will have undefined behaviour 
>> when looking up objects.
>> 
>> Out of interest, Andres Valloud wrote a whole book on 'Hashing in Smalltalk' 
>> (http://www.lulu.com/content/1455536)
>> 
>> Also the Javadoc comments are pretty good in explaining the usage:
>>> The general contract of hashCode is:
>>> Whenever it is invoked on the same object more than once during an 
>>> execution of a Java application, the hashCode method must consistently 
>>> return the same integer, provided no information used in equals comparisons 
>>> on the object is modified. This integer need not remain consistent from one 
>>> execution of an application to another execution of the same application.
>>> If two objects are equal according to the equals(Object) method, then 
>>> calling the hashCode method on each of the two objects must produce the 
>>> same integer result.
>>> It is not required that if two objects are unequal according to the 
>>> equals(Object) method, then calling the hashCode method on each of the two 
>>> objects must produce distinct integer results. However, the programmer 
>>> should be aware that producing distinct integer results for unequal objects 
>>> may improve the performance of hash tables.
>>> As much as is reasonably practical, the hashCode method defined by class 
>>> Object does return distinct integers for distinct objects.
>> Cheers
>> Carlo
>> 
>> On 26 May 2015, at 8:45 PM, Julien Delplanque <jul...@tamere.eu> wrote:
>> 
>> The subject of this mail is exactly my question.
>> 
>> I came to this question by looking at Object>>#= message implementation.
>> 
>> """
>> = anObject
>>    "Answer whether the receiver and the argument represent the same
>>    object. If = is redefined in any subclass, consider also redefining the
>>    message hash."
>> 
>>    ^self == anObject
>> """
>> 
>> When do we need to redefine #hash message?
>> 
>> Is it the right way to implement equality between two objects or is there 
>> another message that I should override?
>> 
>> Regards,
>> Julien
>> 
>> 
>> 
> 
> 


Reply via email to