Problem bei Hashmap Nutzung

Status
Nicht offen für weitere Antworten.
K

Killer

Gast
Hallo Leutz,

ich weiss wie man eine Hashmap nutzt !!!!!!!!!!!!
Aber folgender Code verwirrt mich trotzdem:

Code:
/*
 *  * 
 * This example shows how not to use a Hashmap
 */

import java.util.HashMap;

public class HashConfuser
{
	private HashMap hm = new HashMap();

	public HashConfuser()
	{

	}

	public void run()
	{
		boolean error = false;
		int iterator = 0;
		// Run only till error occurres
		while (!error)
		{
			++iterator;
			hm = new HashMap();
			System.err.println("-->Iteration: " + iterator);
			// Run max 6000 times 
			for (int a = 0; (a < 6000)&&!error; a++)
			{
				// Create object with unique id
				MyObject temp1 = new MyObject(a + "A" + System.nanoTime());
				// generate key for map by hashing the object
				Object key = String.valueOf(temp1.hashCode());
				// Check wether object is already in hashmap
				if (hm.containsKey(key))
				{
					// Can this really happen ?
					// Yes, but why and why always at the same step ?
					System.err.println("------Error occured after " + hm.size() + " objects in iteration " + iterator
							+ " ------:--");
					System.err.println("Duplicate found: *\t " + hm.get(key) + "\n\t\t *\t " + temp1);
					error = true;
				}
				else
				{
					// else store it there !
					hm.put(key, temp1);
				}
			}
		}

	}

	public static void main(String[] args)
	{
		// MAIN
		new HashConfuser().run();
	}

	class MyObject
	{
		private String key = "";

		public MyObject(String key)
		{
			this.key = key;
		}

		public String toString()
		{
			return key;
		}
	}
}

Weiss jemand konkret warum der Fehlerfall auftaucht.
Technische/Logische Begründung !

Danke

Viel Spass
 

thE_29

Top Contributor
Hä?

Was meinst du jetzt damit?

Es kann sein das der gleiche Hashcode von nem anderen Objekt der gleiche ist wie der vom anderen ^^

Das ist das Problem...


Eineindeutig: Sie bedeutet, dass jedes Element der Zielmenge höchstens einmal als Funktionswert angenommen wird. Es werden also keine zwei verschiedenen Elemente der Definitionsmenge auf dasselbe Element der Zielmenge abgebildet. Eine injektive Funktion ist daher (als Relation gesehen) linkseindeutig.


Fu Mathebegriffe!


Auf deutsch, es muss net eindeutig sein... Wayne interssieren mathmatische Begriffe :bae:
 

Leroy42

Top Contributor
Oder anders:

A.equals(B) => hash(A) == hash(B) nennt sich nun mal eindeutige Abbildung

Aber nicht

hash(A) == hash(B) ==> A.equals(B) was dann auch eineindeutig wäre.
 

Leroy42

Top Contributor
Aber das ist doch genau was du ausführlicher beschrieben hast.

Nur

thE_29 hat gesagt.:
Weil der Hashcode nicht eindeutig sein muss!!

stimmt eben nicht! Der Hashcode eines Objekts muß eben doch eindeutig sein.

Er darf nicht für dasselbe (bzgl. equals) Objekt einmal x und einmal y sein.

Oder reden wir aneinander vorbei? ???:L
 

thE_29

Top Contributor
?!?

Object A hat hashcode 112412

Object B hat hashcode 12412

Object AXZ kann auch den hashcode 112412 habe, das meinte ich und das tritt auch bei dem obigen Beispiel auf!


Ein hashcode kann öfters von verschiedenen Objekten vorkommen!
 

RaoulDuke

Bekanntes Mitglied
Ein Hash ist per Definition nie eindeutig.

Und offenbar liefert die hashCode Methode keinen besonders guten Hash so das hier schnell eine Kollision auftritt.

Aus der Dokumentation zu java.lang.Object:

It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.
 

Leroy42

Top Contributor
RaoulDuke hat gesagt.:
Ein Hash ist per Definition nie eindeutig.
Nein, nein und nochmals nein!!! :x :x :x
Wenn der Hashcode nicht eindeutig wäre, könnte es passieren,
daß der hashcode von "Ich bin ein String" einmal 42 und ein anderes
mal 24 sein kann. Und genau das ist eben nicht der Fall.

Wir alle meinen zwar dasselbe, benutzen aber unterschiedliche Wörter
(oder heißt es in diesem Fall Worte ???:L )

Nicht umsonst sagt Google
google hat gesagt.:
Ergebnisse 1 - 100 von ungefähr 54.100 Seiten auf Deutsch für eineindeutig . (0,41 Sekunden)

Mal das 8. Wort lesen
 

RaoulDuke

Bekanntes Mitglied
Du hast doch verstanden was ich gemeint habe und die Konsequenz für das obige Programm erkannt, oder nicht?

Natürlich war damit nicht gemeint, dass die gleichen Daten mit gleichem Hash Algorithmus gehasht unterschiedliche Ergebnisshashes bringen können. Es war gemeint das unterschiedliche Daten gehasht gleiche Hashwerte ergeben können.
 

thE_29

Top Contributor
Jo, leoroy, hör auf uns mit deinen mathematischn Wörtern zu ärgern...


Ich dachte net mal dass das ein Wort ist...

Jeder versteht was wir meinen, das ein hashwert nicht eindeutig sein muss, dh, es kann von anderen Objekten das gleiche sein. Ist aber pro Objekt (wenn sich dieses net ändert) immer der gleiche!

Eineindeutig.. paaa!! :bae:
 

Leroy42

Top Contributor
Jetzt kenne und verstehe ich mal so ein ungewöhnliches
Wort und darf noch nicht mal damit hausieren gehen :(

[schild=2 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]Hier wird geschmollt![/schild]
 

SamHotte

Top Contributor
@Leroy: Zustimmung :toll:
Wenn man verstehen will, wie ein Hash-Algorithmus funktioniert, sollte man so grundlegende Begriffe wie Eineindeutigkeit eigentlich kennen ... :meld:
 
K

Killer

Gast
Hallo zusammen,
das hört sich ja ganz plausibel an,
aber warum habe ich immer den fehler
nach der gleichen anzahl von durchläufen.
Unterschiedlich konstante Zahl auf verschiedenen PCs ?

Danke
 

RaoulDuke

Bekanntes Mitglied
Killer hat gesagt.:
Hallo zusammen,
das hört sich ja ganz plausibel an,
aber warum habe ich immer den fehler
nach der gleichen anzahl von durchläufen.
Unterschiedlich konstante Zahl auf verschiedenen PCs ?

Danke

Weil, wie wir hier ja schon festgestellt haben, die gleichen Daten mit dem gleichen Algorithmus gehasht immer den gleichen Hashwert ergeben. Und offenbar sind in der Schleife 2 Objekte dabei die den gleichen Hashwert ergeben, und das die dann immer an der gleichen Stelle auftrefen ist dann ja logisch.
 

moormaster

Top Contributor
RaoulDuke hat gesagt.:
Killer hat gesagt.:
Hallo zusammen,
das hört sich ja ganz plausibel an,
aber warum habe ich immer den fehler
nach der gleichen anzahl von durchläufen.
Unterschiedlich konstante Zahl auf verschiedenen PCs ?

Danke

Weil, wie wir hier ja schon festgestellt haben, die gleichen Daten mit dem gleichen Algorithmus gehasht immer den gleichen Hashwert ergeben. Und offenbar sind in der Schleife 2 Objekte dabei die den gleichen Hashwert ergeben, und das die dann immer an der gleichen Stelle auftrefen ist dann ja logisch.

Für so etwas gibt es ja auch Kollisionshandling, wo normaler Weise festgelegt wird, was im Kollisionsfall passieren soll.

Nochmal zur Eineindeutigkeit (oder auch Injektivität&Surjektivität bzw Bijektivität *komplette Verwirrung stift* ;) ):

wenn ich eine Menge aus m Objekten auf eine Hashtabelle mit max n verschiedenen Hash-Werten abbilde, kann keine injektive Zuordnung mehr stattfinden (es gibt also mehrere Objekte, die den gleichen Hashwert bekommen), sobald m>n ist, was spätestens beim Hashing von Dateiinhalten passieren dürfte.
Sicherlich kann eine optimale Hashfunktion die Kollisionsfälle minimieren; aber solange man Kollisionen nicht zu 100% durch den Kontext ausschliessen kann, bedarf diese Zuordnung einer Kollisionsbehandlung.

http://cis.stvincent.edu/swd/hash/hash.html
 

Leroy42

Top Contributor
moormaster hat gesagt.:
Nochmal zur Eineindeutigkeit (oder auch Injektivität ;) ):
wenn ich eine Menge aus m Objekten auf eine Hashtabelle mit max n verschiedenen Hash-Werten abbilde, kann keine injektive Zuordnung mehr stattfinden...

Ähh. Bijektiviät :shock:

[schild=5 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]Iss ja gut! Bin ja schon wieder weg[/schild]
 
K

Killer

Gast
RaoulDuke hat gesagt.:
Killer hat gesagt.:
Hallo zusammen,
das hört sich ja ganz plausibel an,
aber warum habe ich immer den fehler
nach der gleichen anzahl von durchläufen.
Unterschiedlich konstante Zahl auf verschiedenen PCs ?

Danke

Weil, wie wir hier ja schon festgestellt haben, die gleichen Daten mit dem gleichen Algorithmus gehasht immer den gleichen Hashwert ergeben. Und offenbar sind in der Schleife 2 Objekte dabei die den gleichen Hashwert ergeben, und das die dann immer an der gleichen Stelle auftrefen ist dann ja logisch.


Nunja, aber wie man sieht werden die Objekte und deren Inhalt zur Laufzeit (und eigentlich eindeutig) erzeugt in folgenden Code sogar mit Zufallszahlen.
So dass diese gleichen (hash-gleichen) Objekte eher zufällig und nicht konstant erzeugt werden sollten.
Und nu ?

Code:
/*
 *  * 
 * This example shows how not to use a Hashmap
 */

import java.util.HashMap;
import java.util.Random;

public class HashConfuser
{
	private HashMap hm = new HashMap();

	public HashConfuser()
	{

	}

	public void run()
	{
		Random ran=new Random();
		boolean error = false;
		int iterator = 0;
		// Run only till error occurres
		while (!error)
		{
			++iterator;
			hm = new HashMap();
			System.err.println("-->Iteration: " + iterator);
			// Run max 6000 times 
			for (int a = 0; (a < 6000)&&!error; a++)
			{
				// Create object with unique id
				MyObject temp1 = new MyObject(ran.nextInt(10000)+a + "A" + System.nanoTime());
				// generate key for map by hashing the object
				Object key = String.valueOf(temp1.hashCode());
				// Check wether object is already in hashmap
				if (hm.containsKey(key))
				{
					// Can this really happen ?
					// Yes, but why and why always at the same step ?
					System.err.println("------Error occured after " + hm.size() + " objects in iteration " + iterator
							+ " ------:--");
					System.err.println("Duplicate found: *\t " + hm.get(key) + "\n\t\t *\t " + temp1);
					error = true;
				}
				else
				{
					// else store it there !
					hm.put(key, temp1);
				}
			}
		}

	}

	public static void main(String[] args)
	{
		// MAIN
		new HashConfuser().run();
	}

	class MyObject
	{
		private String key = "";

		public MyObject(String key)
		{
			this.key = key;
		}

		public String toString()
		{
			return key;
		}
	}
}
 

thE_29

Top Contributor
Woher willst du wissen wie sich der hash bei strings zusammensetzt??

Vielleicht isses einfach ascii code multipolizieren, etc...


Und dann hast du irgendwann zufällig das gleiche.. bzw könntest mathematisch berechnen, wann das nächste gleiche auftritt..
 

SamHotte

Top Contributor
Wie wäre es, in MyObject einfach die Methode 'hashCode()' zu überschreiben? Die von Object geerbte ist nicht wirklich gut ...

Edit:
zum Beispiel so:
Code:
  final int basis = 37;
  final int multi = 17;

  public int hashCode ()
  {
    int result = basis;
    result = multi * result + this.intAttribut1;
    result = multi * result + this.intAttribut2;
    result = multi * result + this.intAttribut3;
    // ... weitere int-Attribute
    result = multi * result + this.stringAttribut1.hashCode();
    result = multi * result + this.stringAttribut2.hashCode();
    result = multi * result + this.stringAttribut3.hashCode();
    // ... weitere String-Attribute
    // ... sonstige Attribute entsprechend konstruieren
    return result;
  }

So sollte eine Hashfunktion aussehen (in Anlehnung an: Joshua Bloch, Effektiv Java programmieren).
 
K

Killer

Gast
SamHotte hat gesagt.:
Wie wäre es, in MyObject einfach die Methode 'hashCode()' zu überschreiben? Die von Object geerbte ist nicht wirklich gut ...


Keine Änderung ....


Code:
/*
 *  * 
 * This example shows how not to use a Hashmap
 */

import java.util.HashMap;
import java.util.Random;

public class HashConfuser
{
	private HashMap hm = new HashMap();

	public HashConfuser()
	{

	}

	public void run()
	{
		Random ran=new Random();
		boolean error = false;
		int iterator = 0;
		// Run only till error occurres
		while (!error)
		{
			++iterator;
			hm = new HashMap();
			System.err.println("-->Iteration: " + iterator);
			// Run max 6000 times 
			for (int a = 0; (a < 6000)&&!error; a++)
			{
				// Create object with unique id
				MyObject temp1 = new MyObject(ran.nextInt(100)+a+ System.nanoTime());
				// generate key for map by hashing the object
				Object key = String.valueOf(temp1.hashCode());
				// Check wether object is already in hashmap
				if (hm.containsKey(key))
				{
					// Can this really happen ?
					// Yes, but why and why always at the same step ?
					System.err.println("------Error occured after " + hm.size() + " objects in iteration " + iterator
							+ " ------:--");
					System.err.println("Duplicate found: *\t " + hm.get(key) + "\n\t\t *\t " + temp1);
					error = true;
				}
				else
				{
					// else store it there !
					hm.put(key, temp1);
				}
			}
		}

	}

	public static void main(String[] args)
	{
		// MAIN
		new HashConfuser().run();
	}

	class MyObject
	{
		private long key = -1;

		public MyObject(long key)
		{
			this.key = key;
		}

		public int hashCode()
		{
			//unique systemadress
			return System.identityHashCode(this);
		}
		
		public String toString()
		{
			return ""+key;
		}
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E HashMap Problem Java Basics - Anfänger-Themen 5
M Semantisches Problem HashMap/Netzwerk Java Basics - Anfänger-Themen 4
W OOP problem mit HashMap Java Basics - Anfänger-Themen 7
H Problem mit HashMap Java Basics - Anfänger-Themen 2
T Problem mit Implementierung von einer HashMap aufgabe Java Basics - Anfänger-Themen 2
T HashMap-Problem Java Basics - Anfänger-Themen 8
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Schleife Problem Java Basics - Anfänger-Themen 2
D Problem mit der Erkennung von \n Java Basics - Anfänger-Themen 2
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
P Problem mit Calendar.getDisplayName() Java Basics - Anfänger-Themen 8
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
M Problem mit Klassenverständnis und Button Java Basics - Anfänger-Themen 8
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
H Problem mit Verzweigungen Java Basics - Anfänger-Themen 6
H Problem mit Rückgabewert Java Basics - Anfänger-Themen 7
josfe1234 JAVA FX problem Java Basics - Anfänger-Themen 3
A Code Problem Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
J Problem mit "ArrayIndexOutOfBoundsException" Java Basics - Anfänger-Themen 11
K jackson Mapping - Problem mit Zeitzonen Java Basics - Anfänger-Themen 10
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
D Schleifen Problem Java Basics - Anfänger-Themen 2
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
T Problem mit Lehrzeichen und String bei einfacher Chiffre Java Basics - Anfänger-Themen 8
J extends Problem Java Basics - Anfänger-Themen 2
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
amgadalghabra algorithmisches Problem Java Basics - Anfänger-Themen 19
J Traveling Salesman Problem [Arrays] Java Basics - Anfänger-Themen 9
R ArrayList Problem Java Basics - Anfänger-Themen 6
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
C RegEx Problem Java Basics - Anfänger-Themen 4
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
M Input/Output Fallunterscheidung Problem Java Basics - Anfänger-Themen 17
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
M Problem bei Ausgabe Java Basics - Anfänger-Themen 7
Splayfer Java Array Problem... Java Basics - Anfänger-Themen 2
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
G Subset sum problem mit Backtracking Java Basics - Anfänger-Themen 18
N Problem mit Scanner Java Basics - Anfänger-Themen 2
J Klassen Problem Java Basics - Anfänger-Themen 8
A Out.format problem. Java Basics - Anfänger-Themen 3
J Problem bei der Programmierung eines Tannenbaums Java Basics - Anfänger-Themen 9
A Array problem Java Basics - Anfänger-Themen 16
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
W Remote Method Invocation RMI - Problem Java Basics - Anfänger-Themen 0
I Ich habe ein Problem Java Basics - Anfänger-Themen 3
A Problem bei returnen eines Wertes Java Basics - Anfänger-Themen 6
M Regex Erstellung Problem Java Basics - Anfänger-Themen 2
D Input/Output Problem bei der Benutzereingabe eines Befehls Java Basics - Anfänger-Themen 14
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
F Habe ein problem mit dem ActionListener Java Basics - Anfänger-Themen 3
C Regex-Problem Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
M Problem in der Modellierung Java Basics - Anfänger-Themen 20
W Wo ist das URL-Problem ? Java Basics - Anfänger-Themen 1
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
D FileWriter / FileReader Problem Java Basics - Anfänger-Themen 10
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0

Ähnliche Java Themen

Neue Themen


Oben