Re: Implementing isEqual: and hash
Re: Implementing isEqual: and hash
- Subject: Re: Implementing isEqual: and hash
- From: Jeff Johnson <email@hidden>
- Date: Sat, 23 Aug 2008 12:26:48 -0500
On Aug 23, 2008, at 11:38 AM, Adam R. Maxwell wrote:
On Aug 23, 2008, at 5:13 AM, Michael Ash wrote:
On Sat, Aug 23, 2008 at 7:41 AM, Graham Cox
<email@hidden> wrote:
I have a class for which equality can be defined as having the
same internal
string value (which happens to be a UUID-turned-string). I can
easily
implement isEqual: based on that but the docs say I also need to
implement
-hash. Any pointers on what is a good way to do that? Could I
just safely
defer to the -hash returned by the string in question?
The implementation of -hash should *always* match the implementation
of -isEqual:.
And as Jim alluded, -hash must not depend on mutable properties; if
the hash changes while the object is in a hashing collection,
you'll end up with random crashes.
Right. Thus, it's a bad idea to use mutable properties in isEqual:.
If you find yourself tempted to do that, impement an
isEqualToMyClass: method rather than isEqual:.
If you compare primitives in -isEqual:, you should combine them
(using
xor or the like) in -hash. If you compare objects by calling -
isEqual:
on them, you should combine their hashes (using xor or the like). If
you do some of each, combine them all.
What's the motivation for combining hashes in this case? I've
wondered what is the best thing to do when isEqual: is based on
comparing multiple ivars; I typically just use one of them for the
hash.
It's a documented requirement of the isEqual: and hash methods that
the hash must be the same when isEqual: returns YES. Thus, whatever
logic that returns YES in isEqual: must have some kind of match in hash.
-Jeff
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden