dictionary keys, __hash__, __cmp__
mwh at python.net
Wed Nov 5 14:16:58 CET 2003
Jan-Erik Meyer-Lütgens <python at meyer-luetgens.de> writes:
> In the Python Language Reference, I found the following
> statements about using objects as dictionary keys:
> 1. "__hash__() should return a 32-bit integer."
> 2. "The only required property is that objects which
> compare equal have the same hash value."
> 3. "If a class does not define a __cmp__() method it
> should not define a __hash__() operation either."
> Can I asume that:
> -- it is guaranteed that id(obj) returns a unique 32-bit integer
No. For instance it doesn't on a 64-bit platform (and on a ridiculous
64 bit platform *cough*Win64*cough* it might even return a long).
> -- keys are interchangeable (equivalent),
> if the following is valid:
> hash(key1) == hash(key2) and key1 == key2
Not quite sure what you mean by equivalent, but if that is true
a key inserted under key1 can be retrieved with key2.
> -- I can ignore the 2nd statement, if I am aware of
> the fact that: if objects are equal it dosn't mean that
> they are the same key.
Um, I don't understand you, but I think the answer is "no".
If you ever have a situation where hash(a) != hash(b) but a == b then
you are very much breaking the rules.
> -- I can savely ignore the 3rd statement, because python
> falls back to cmp(id(obj1), id(obj2)), if __cmp__()
> is not defined.
I wouldn't trust the Anglo-Saxons for much anything else. Given
they way English is spelled, who could trust them on _anything_ that
had to do with writing things down, anyway?
-- Erik Naggum, comp.lang.lisp
More information about the Python-list