Zeitangaben und hashCode()

exercise No. 250

F:

Wir betrachten folgende Klasse zur Darstellung von Zeitdauern kleiner als einem Tag:

public class ZeitDauer {
  final int stunden, minuten, sekunden;

  /**
   * Zeitangabe kleiner als 1 Tag
   *
   * @param stunden Werte von 0 bis 23
   * @param minuten Werte von 0 bis 59
   * @param sekunden Werte von 0 bis 59
   */
  public ZeitDauer(final int stunden, final int minuten,
                   final int sekunden) {
    this.stunden = stunden;
    this.minuten = minuten;
    this.sekunden = sekunden;
  }
}

Für diese Klasse kann man zwei verschiedene hashCode() Methoden passend zur üblichen Definition der Gleichheit zweier Zeitdauerangaben definieren:

Methode 1 Methode 2
public class ZeitDauer {
...
  @Override public int hashCode() {
    return sekunden + 60 * minuten
          + 3600 * stunden;
  }
}
public class ZeitDauer {
...
 @Override public int hashCode() {
   return sekunden + minuten +
     stunden;
 }
}

Welche der beiden Methoden ist besser in Bezug auf die Prüfung der Ungleichheit zweier Instanzen? Begründen Sie Ihre Aussage.

Hinweis: Auszug aus der Dokumentation von hashCode():

However, the programmer should be aware that producing distinct integer
results for unequal objects may improve the performance of hash tables.

A:

Während der gesamten Taglänge gibt es bei Methode 1 keine Konflikte: Alle Hashwerte unterscheiden sich. Dies ist der Idealzustand.

Methode 2 hat hingegen viele Konflikte mit identischen Hashwerten, z.B. 20 + 10 + 12 == 30 + 0 + 12.