Go Back   Rhinocerus > Newsgroup > Newsgroup comp.lang.java.* > Newsgroup comp.lang.java.programmer

Reply
 
Thread Tools Display Modes
  #1 (permalink)  
Old 08-10-2012, 06:39 PM
bob smith
Guest
 
Posts: n/a
Default hashCode

From: bob smith <bob@coolfone.comze.com>

Is it always technically correct to override the hashCode function like so:

@Override
public int hashCode() {
return 1;
}

Would it be potentially better if that was Object's implementation?

--- BBBS/Li6 v4.10 Dada-1
* Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24
Reply With Quote
Alt Today
Advertising
 
and become member of Rhinocerus
Standard Sponsored Links

  #2 (permalink)  
Old 08-10-2012, 06:39 PM
Arne Vajhøj
Guest
 
Posts: n/a
Default Re: hashCode

To: bob smith
From: Arne Vajhoj <arne@vajhoej.dk>

On 8/10/2012 11:47 AM, bob smith wrote:
> Is it always technically correct to override the hashCode function like so:
>
> @Override
> public int hashCode() {
> return 1;
> }


It meets the minimum contractual obligation for that method.

But performance of anything using the hash capability (like HashMap<>) would be
very bad.

> Would it be potentially better if that was Object's implementation?


It has a different behavior that may not be valid if you override equals.

Arne

--- BBBS/Li6 v4.10 Dada-1
* Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24
Reply With Quote
  #3 (permalink)  
Old 08-10-2012, 06:39 PM
Eric Sosman
Guest
 
Posts: n/a
Default Re: hashCode

To: bob smith
From: Eric Sosman <esosman@ieee-dot-org.invalid>

On 8/10/2012 11:47 AM, bob smith wrote:
> Is it always technically correct to override the hashCode function like so:
>
> @Override
> public int hashCode() {
> return 1;
> }
>
> Would it be potentially better if that was Object's implementation?


Define "better."

--
Eric Sosman
esosman@ieee-dot-org.invalid

--- BBBS/Li6 v4.10 Dada-1
* Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24
Reply With Quote
  #4 (permalink)  
Old 08-10-2012, 06:39 PM
markspace
Guest
 
Posts: n/a
Default Re: hashCode

To: Arne Vajhøj
From: markspace <-@.>

On 8/10/2012 9:13 AM, Arne Vajhoj wrote:
> On 8/10/2012 11:47 AM, bob smith wrote:
>> Is it always technically correct to override the hashCode function
>> like so:
>>
>> @Override
>> public int hashCode() {
>> return 1;
>> }

>
> It meets the minimum contractual obligation for that method.
>
> But performance of anything using the hash capability (like HashMap<>)
> would be very bad.
>
>> Would it be potentially better if that was Object's implementation?

>
> It has a different behavior that may not be valid if you override equals.



I think at this point we are doing Bob's homework for him.

--- BBBS/Li6 v4.10 Dada-1
* Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24
Reply With Quote
  #5 (permalink)  
Old 08-10-2012, 06:39 PM
Arne Vajhøj
Guest
 
Posts: n/a
Default Re: hashCode

To: markspace
From: Arne Vajhoj <arne@vajhoej.dk>

On 8/10/2012 1:13 PM, markspace wrote:
> On 8/10/2012 9:13 AM, Arne Vajhoj wrote:
>> On 8/10/2012 11:47 AM, bob smith wrote:
>>> Is it always technically correct to override the hashCode function
>>> like so:
>>>
>>> @Override
>>> public int hashCode() {
>>> return 1;
>>> }

>>
>> It meets the minimum contractual obligation for that method.
>>
>> But performance of anything using the hash capability (like HashMap<>)
>> would be very bad.
>>
>>> Would it be potentially better if that was Object's implementation?

>>
>> It has a different behavior that may not be valid if you override equals.

>
> I think at this point we are doing Bob's homework for him.


Could be.

But I think the question whether returning a constant from hashCode is a valid
Java question for understanding the contract for that method.

And I am pretty sure that I have seen other similar examples (just with 42 as
constant).

Arne

--- BBBS/Li6 v4.10 Dada-1
* Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24
Reply With Quote
  #6 (permalink)  
Old 08-11-2012, 06:17 PM
Roedy Green
Guest
 
Posts: n/a
Default Re: hashCode

To: bob smith
From: Roedy Green <see_website@mindprod.com.invalid>

On Fri, 10 Aug 2012 08:47:12 -0700 (PDT), bob smith
<bob@coolfone.comze.com> wrote, quoted or indirectly quoted someone
who said :

> @Override
> public int hashCode() {
> return 1;
> }


that's about the worst possible hashCode function.

See http://mindprod.com/jgloss/hashcode.html for tips on how to write good
ones.
--
Roedy Green Canadian Mind Products http://mindprod.com A new scientific truth
does not triumph by convincing its opponents and making them see the light,
but rather because its opponents eventually die, and a new generation grows up
that is familiar with it.
~ Max Planck 1858-04-23 1947-10-04

--- BBBS/Li6 v4.10 Dada-1
* Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24
Reply With Quote
  #7 (permalink)  
Old 08-11-2012, 06:17 PM
Lew
Guest
 
Posts: n/a
Default Re: hashCode

To: Roedy Green
From: Lew <lewbloch@gmail.com>

Roedy Green wrote:
> bob smith wrote, quoted or indirectly quoted someone
> who said :
>
>> @Override
> > public int hashCode() {
> > return 1;
> > }

>
> that's about the worst possible hashCode function.


Normally that's correct, but it's conceivable that one might do it for some
hackish reason. In most situations where one might do such an override as this,
one would do better not to override hashCode().

> See http://mindprod.com/jgloss/hashcode.html for tips on how to write
> good ones.


The default of assembling it via the mix-in of attribute hash codes using the
Knuth constants is usually good enough.

h(object) = Sum(i rnn 0.. n-1) of ( attribute[i] * pow(31, n - 1 - i) );

or

public static int calculateHash(Foo arg) {
int h = 0;

for ( each attribute of Foo that contributes to 'equals()' )
{
h = 31 * h + attribute.hashCode();
}
return h;
}

http://en.wikipedia.org/wiki/Hash_function
http://en.wikipedia.org/wiki/Java_hashCode()
http://en.wikipedia.org/wiki/Java_hashCode()#Java

--
Lew

--- BBBS/Li6 v4.10 Dada-1
* Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24
Reply With Quote
  #8 (permalink)  
Old 08-11-2012, 06:17 PM
bob smith
Guest
 
Posts: n/a
Default Re: hashCode

To: Eric Sosman
From: bob smith <bob@coolfone.comze.com>

On Friday, August 10, 2012 11:34:28 AM UTC-5, Eric Sosman wrote:
> On 8/10/2012 11:47 AM, bob smith wrote:
>
> > Is it always technically correct to override the hashCode function like so:

>
> >

>
> > @Override

>
> > public int hashCode() {

>
> > return 1;

>
> > }

>
> >

>
> > Would it be potentially better if that was Object's implementation?

>
>
>
> Define "better."
>
>
>
> --
>
> Eric Sosman
>
> esosman@ieee-dot-org.invalid


Better in the sense that you would never HAVE to override hashCode.

Now, there are cases where you HAVE to override it, or your code is very
broken.

--- BBBS/Li6 v4.10 Dada-1
* Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24
Reply With Quote
  #9 (permalink)  
Old 08-11-2012, 06:17 PM
Lew
Guest
 
Posts: n/a
Default Re: hashCode

To: bob smith
From: Lew <lewbloch@gmail.com>

bob smith wrote:
> Eric Sosman wrote:
>> bob smith wrote:
>>> Is it always technically correct to override the hashCode function like so:


It complies with the contract for 'hashCode()'. Is that all it takes to be
correct?

>>> Would it be potentially better if that was Object's implementation?


Would what be better if what were Object's implementation of what?

>> Define "better."


> Better in the sense that you would never HAVE to override hashCode.
>
> Now, there are cases where you HAVE to override it, or your code is very

broken.

No.

No matter what 'Object''s 'hashCode()' implementation were, it would need to be
overridden when you want value equality instead of object identity for
'equals()'.

See Joshua Bloch's seminal work /Effective Java/, which has items that pertain
to this.

Bottom line: 'hashCode()', 'equals()', and when present, 'compareTo()' must be
consistent.

'toString()' should be consistent with those.

As long as 'hashCode()' fulfills the contract, your code will work -
functionally. But a bad
'hashCode()' could and likely will noticeably affect performance. There is more
to correctness
than mere functional conformance.

--
Lew

--- BBBS/Li6 v4.10 Dada-1
* Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24
Reply With Quote
  #10 (permalink)  
Old 08-11-2012, 06:17 PM
Arne Vajhøj
Guest
 
Posts: n/a
Default Re: hashCode

To: Roedy Green
From: Arne Vajhoj <arne@vajhoej.dk>

On 8/10/2012 3:17 PM, Roedy Green wrote:
> On Fri, 10 Aug 2012 08:47:12 -0700 (PDT), bob smith
> <bob@coolfone.comze.com> wrote, quoted or indirectly quoted someone
> who said :
>
>> @Override
>> public int hashCode() {
>> return 1;
>> }

>
> that's about the worst possible hashCode function.


Yes, but the posted asked "Is it always technically correct to ..." not whether
is was "best possible".

Arne

--- BBBS/Li6 v4.10 Dada-1
* Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24
Reply With Quote
  #11 (permalink)  
Old 08-11-2012, 06:17 PM
Arne Vajhøj
Guest
 
Posts: n/a
Default Re: hashCode

To: Lew
From: Arne Vajhoj <arne@vajhoej.dk>

On 8/10/2012 6:32 PM, Lew wrote:
> bob smith wrote:
>> Now, there are cases where you HAVE to override it, or your code is very

broken.
>
> No.


> As long as 'hashCode()' fulfills the contract, your code will work -

functionally. But a bad
> 'hashCode()' could and likely will noticeably affect performance. There is

more to correctness
> than mere functional conformance.


If the code per specs is guaranteed to work then it is correct.

Good (or just decent) performance is not necessary for code to be correct.

At least not in the traditional programming terminology.

In plain English maybe.

Arne

--- BBBS/Li6 v4.10 Dada-1
* Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24
Reply With Quote
  #12 (permalink)  
Old 08-11-2012, 06:17 PM
Arne Vajhøj
Guest
 
Posts: n/a
Default Re: hashCode

To: bob smith
From: Arne Vajhoj <arne@vajhoej.dk>

On 8/10/2012 6:22 PM, bob smith wrote:
> On Friday, August 10, 2012 11:34:28 AM UTC-5, Eric Sosman wrote:
>> On 8/10/2012 11:47 AM, bob smith wrote:
>>> Is it always technically correct to override the hashCode function like so:
>>> @Override
>>> public int hashCode() {
>>> return 1;
>>> }
>>> Would it be potentially better if that was Object's implementation?

>>
>> Define "better."

>
> Better in the sense that you would never HAVE to override hashCode.
>
> Now, there are cases where you HAVE to override it, or your code is very

broken.

It is not broken.

It will perform poorly in many cases.

Arne

--- BBBS/Li6 v4.10 Dada-1
* Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24
Reply With Quote
  #13 (permalink)  
Old 08-11-2012, 06:17 PM
rossum
Guest
 
Posts: n/a
Default Re: hashCode

To: Arne Vajhøj
From: rossum <rossum48@coldmail.com>

On Fri, 10 Aug 2012 13:38:19 -0400, Arne Vajh-,j <arne@vajhoej.dk> wrote:

>And I am pretty sure that I have seen other similar
>examples (just with 42 as constant).

The magic word is "Bloch".

rossum

--- BBBS/Li6 v4.10 Dada-1
* Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24
Reply With Quote
 
  #14 (permalink)  
Old 08-11-2012, 06:17 PM
Roedy Green
Guest
 
Posts: n/a
Default Re: hashCode

To: Lew
From: Roedy Green <see_website@mindprod.com.invalid>

On Fri, 10 Aug 2012 12:45:07 -0700 (PDT), Lew <lewbloch@gmail.com> wrote,
quoted or indirectly quoted someone who said :

> h =3D 31 * h + attribute.hashCode();
> }

In my essay I recommend XOR which is an inherentely faster operation than
multiply. I wonder which actually works out better. If you had a large number
of fields, the multiply effect could fall off the left hand end. It is the
algorithm used for String which could have very long strings, so Sun must have
thought of that.
--
Roedy Green Canadian Mind Products http://mindprod.com A new scientific truth
does not triumph by convincing its opponents and making them see the light,
but rather because its opponents eventually die, and a new generation grows up
that is familiar with it.
~ Max Planck 1858-04-23 1947-10-04

--- BBBS/Li6 v4.10 Dada-1
* Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24
Reply With Quote
  #15 (permalink)  
Old 08-11-2012, 06:17 PM
Eric Sosman
Guest
 
Posts: n/a
Default Re: hashCode

To: bob smith
From: Eric Sosman <esosman@ieee-dot-org.invalid>

On 8/10/2012 6:22 PM, bob smith wrote: [... many blank lines removed for
legibility's sake ...]
> On Friday, August 10, 2012 11:34:28 AM UTC-5, Eric Sosman wrote:
>> On 8/10/2012 11:47 AM, bob smith wrote:
>>
>>> Is it always technically correct to override the hashCode function like so:
>>>
>>> @Override
>>> public int hashCode() {
>>> return 1;
>>> }
>>>
>>> Would it be potentially better if that was Object's implementation?

>>
>> Define "better."

>
> Better in the sense that you would never HAVE to override hashCode.
>
> Now, there are cases where you HAVE to override it, or your code is very

broken.

I cannot think of a case where you HAVE to override hashCode(),
except as a consequence of other choices that you didn't HAVE to make. You
don't HAVE to invent classes where distinct instances are considered equal, and
even if you do you don't HAVE to put those instances in HashMaps or HashSets or
whatever.

But that's a bit specious: All it says is that you don't HAVE
to override hashCode() because you don't HAVE to use things that call it. It's
like "You don't HAVE to pay taxes, because you don't HAVE to live outside
prison." So, let's take it as a given that you will often need to write
classes that override equals() and hashCode() -- I imagine you understand that
they go together.

Okay: Then returning a constant 1 (or 42 or 0 or whatever)
would in fact satisfy the letter of the law regarding hashCode(): Whenever
x.equals(y) is true, x.hashCode() == y.hashCode(). In your example this would
be trivially true because x,y,z,... all have the same hashCode() value, whether
they're equal or not -- You have lived up to the letter of the law.

Of course, such a hashCode() would make all those hash-based
containers pretty much useless: They would work in the sense that they would
get the Right Answer, but they'd be abominably slow, with expected performance
of O(N) instead of O(1). See
<http://www.cs.rice.edu/~scrosby/hash/CrosbyWallach_UsenixSec2003/>
for a survey of some denial-of-service attacks that work by driving hash tables
from O(1) to O(N), resulting in catastrophic failure of the attacked system.

In other words, the letter of the law on hashCode() is a bare
minimum that guarantees correct functioning, but it is not enough to guarantee
usability. Why isn't the law more specific? Because nobody knows how to write
"hashCode() must be correct *and* usable" in terms that would cover all the
classes all the Java programmers have dreamed up and will dream up. Your
hashCode() meets the bare minimum requirement, but is not "usable." The actual
hashCode() provided by Object also meets the bare minimum requirement, and *is*
usable as it stands, until (and unless; you don't HAVE to) you choose to
implement other equals() semantics, and a hashCode() to match them.


--
Eric Sosman
esosman@ieee-dot-org.invalid

--- BBBS/Li6 v4.10 Dada-1
* Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24
Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are Off
Refbacks are Off




All times are GMT. The time now is 12:08 AM.


Copyright ©2009

LinkBacks Enabled by vBSEO 3.3.0 RC2 © 2009, Crawlability, Inc.