hashCode() für zwei ints

Ninca

Mitglied
Hallo,

kann mir jemand mit der hashCode Funktion eines Objekts helfen? Das Objekt besteht aus 2 wichtigen int-Werten, die in den Feldern smaller und larger gespeichert werden. Beim Googlen bin ich bisher nicht auf eine geeigneten mathematischen Funktion gestoßen.

Ausprobiert habe ich:
Java:
	private void setCreateHash(int i, int j){
		if(i > j) {
			smaller = j;  larger = i;
		} else {
			smaller = i;  larger = j;
		}

		int result = 17;
		result = 37 * result + smaller;
		result = 37 * result + larger;
		hashCode = result;
	}
        public int hashCode(){
               return hashCode;
	}

Zum Testen benutze ich folgenden Code:
Java:
@Test
	public void testHash(){
		TreeSet<HashObj> set = new TreeSet<HashObj>();

		for(int i=0; i<4000; i++){
			for (int j=i+1; j<4000; j++){
				HashObj o = new HashObj(i,j);

				if(set.contains(o)){
					System.out.println("i: " + i + " j: " + j + " code: " + o.getHashCode() );
				}
				assertFalse(set.contains(o));
				set.add(o);
			}
		}
	}

Vielen Dank für eine Antwort, ich freu mich auch über einen Link!
 
Was denkst du denn für was die Methode "hashCode()" gut ist bzw. wie diese Methode innerhalb eines HashSet's (TreeSet's) wirkt?
 
Der Code sieht für mich auch gut aus, auch wenn man es etwas kürzer schreiben könnte:

Java:
    private void setCreateHash(int i, int j){
        smaller = Math.min(i,j);
        larger = Math.max(i,j);
 
        hashCode = (17*37+smaller)*37 + larger;
    }

    public int hashCode(){
           return hashCode;
    }

Natürlich sollten Werte in einem Key unveränderlich sein (also den Initialisierungs-Code am besten in den Konstruktor verschieben und smaller, larger und hashCode alle final machen). Dass du auch equals überschreiben musst, sollte klar sein:

Java:
    public boolean equals(Object o){
           if(o instanceof HashObj) {
               HashObj that = (HahsObj) o;
               return this.smaller == that.smaller && this.larger == that.larger;
           }
           return false;
    }
 

Zurück
Oben