[Glass] Hash implementations

monty via Glass glass at lists.gemtalksystems.com
Thu Mar 15 08:16:35 PDT 2018


First, #= methods should start like this:

= anObject
    self == anObject
        ifTrue: [^ true]. "they're identical; no further comparisons"

    self species == anObject species
        ifFalse: [^ false]. "different kinds of objects; no further comparisons"

    "...compare self's state with anObject's state"

Why #species instead of #class? Because it supports polymorphism. If someone creates a ClassB subclass of your ClassA class, but only changes the implementation slightly and wants instances of both to be #= when they share the same state, they just have to implement ClassB>>#species to return ClassA. Now ClassA>>#= will work polymorphically, since both classes return the same #species (ClassA).

For #hash, since it's non-cryptographic, collisions (two unequal objects reporting the same #hash) are permitted, but undesirable. The main requirement is that __whenever two objects are #=, their #hashes are #= too__.

In fact, it's not uncommon to see #hash implementations only use a proper subset of the state that their corresponding #= method does to make #hash faster, but at the cost of more collisions. Compare ZnUrl #hash with #=.


Sent: Thursday, March 15, 2018 at 6:28 AM
From: "Trussardi Dario Romano via Glass" <glass at lists.gemtalksystems.com>
To: "GemStone Seaside beta discussion" <glass at lists.gemtalksystems.com>
Subject: [Glass] Hash implementations

Ciao,
 
i have a seaside application development with Pharo ( 4.0 ) and deployment with Gemstone GLASS.
 
Now  i have some doubts about collisions regarding the hashing and the equality implementation.
 
Where for collision i intend the same hashing value from two different object.
 
 
For example i have a class where redefine the methods :  =   and the relative  hash .
 
= anItem
 
anItem ifNil:[^false].
 
anItem class = self class ifFalse:[ ^false].
 
^ rfrConsegna = anItem rfrConsegna
and:[ rfrSubTable = anItem rfrSubTable
and:[ referenceTime = anItem referenceTime
and:[ consumer = anItem consumer
and:[ item = anItem item
and:[ opzioniVoce = anItem opzioniVoce ]]]]]
 
 
hash
 
^ self class hash
bitXor:( rfrConsegna hash
bitXor:( rfrSubTable hash
bitXor: ( referenceTime hash
bitXor: ( consumer hash
bitXor: ( item hash
bitXor: ( opzioniVoce hash ))))))
 
 
( All variables used define the respective methods:    =    hash )
 
Now all works fine, 
 
but i can have collision ?
 
>From the theoretical point of view it is right ?
 
Someone can give me indications about it?
 
Thanks for any considerations.
 
Dario_______________________________________________ Glass mailing list Glass at lists.gemtalksystems.com http://lists.gemtalksystems.com/mailman/listinfo/glass


More information about the Glass mailing list