Hi Esteban,

I understand your surprise, but it has to be like that.

Two objects that are equals have to have the same hash value. This is part of 
the contract. 
And to comply with this rule with collections, the hash value has to reflect 
the content of the collection.

Java has the same behavior.

Cheers,
Alexandre
-- 
_,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
Alexandre Bergel  http://www.bergel.eu
^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.



> On Oct 9, 2015, at 11:07 AM, Esteban Lorenzano <[email protected]> wrote:
> 
> but that’s an error, I think. 
> a collection has to have always same hash… no matter its size (because is not 
> an array) and no matter his elements.
> 
> 
>> On 09 Oct 2015, at 15:21, Levente Uzonyi <[email protected]> wrote:
>> 
>> You simply don't modify _objects_ which are used as keys in hashed 
>> collections. Or if you do so, you'll have to deal with the consequences 
>> yourself.
>> 
>> Levente
>> 
>> On Fri, 9 Oct 2015, Esteban Lorenzano wrote:
>> 
>>> Hi,
>>> 
>>> Can anyone explain me how this is correct?
>>> 
>>> Collection>>#hash
>>>     "Answer an integer hash value for the receiver such that,
>>>       -- the hash value of an unchanged object is constant over time, and
>>>       -- two equal objects have equal hash values"
>>> 
>>>     | hash |
>>> 
>>>     hash := self species hash.
>>>     self size <= 10 ifTrue:
>>>             [self do: [:elem | hash := hash bitXor: elem hash]].
>>>     ^hash bitXor: self size hash
>>> 
>>> 
>>> I mean… a hash that changes when I add elements to the collection… how can 
>>> this work?
>>> 
>>> Esteban
> 
> 

Reply via email to