Re: the hashCode() contract
There's absolutely no requirement that different instances of the same class, for which equals(...) returns flase, must have differing hashCode. In fact, it's usually impossible, as the number of different, non-equal instances is usually more than Integer.MAX_VALUE.
A well distributed hashCode can however improve the performance of a hash based collection (Hashtable, HashMap etc). If you're never going to use instances of the class in a hash based collection, you might as well have hashCode() return 0 (or 1, or any constant).
For more, search the net for "hashcode collision"