Ermitteln einer eindeutigen ID eines Objekts möglich?

Enternix

Mitglied
Ich würde gerne IDs oder Adressen von Objekten ermitteln. Mit Hilfe dieser IDs möchte ich feststellen, ob zwei Objekte identisch sind. Leider scheint der Weg über den HashCode eines Objekts nach wie vor unzureichend zu sein: Zwei verschiedene Objekte können leider den selben HashCode besitzen (Bug 6321873).

Warum ich die ID brauche und ich nicht über "==" gehe: In SWT möchte ich ByteArrayTransfer erweitern, um einen eigenen Transfer-Typen für das "drag & drop" zu erstellen. In ihm soll eine ID gespeichert sein, mit der ich testen kann, ob zwei Objekte identisch sind. So kann ich dann überprüfen, ob ich beim "drag & drop" ein Objekt auf sich selbst fallen gelassen habe.
 
G

Gast2

Gast
Zwei verschiedene Objekte können leider den selben HashCode besitzen
Ist ja auch klar, es gibt nur einen endlichen Zahlenraum für (theoretisch) unendlich viele Objekte.

Code:
System.identityHashCode(Object)
wird daran auch nichts ändern, da hat man auch nur nen endlichen Zahlenraum.

Ich würde die beiden Objekte einfach per == vergleichen, oder könnte das bei dir Probleme machen?
 

FArt

Top Contributor
Du könntest eine UUID führen, die jedes Objekt erzeugt wenn es instanziiert wird.

EDIT:
du kannst natürlich auch für alle in Frage kommenden Objekte eine UUID erstellen und die Relation über eine Map oder so pflegen. Diese Id dann als zum Vergleich heranziehen. Das kann ein passender Comparator kapseln.
 
Zuletzt bearbeitet:
M

maki

Gast
Leider scheint der Weg über den HashCode eines Objekts nach wie vor unzureichend zu sein
hashcode war nie dafür gedacht eindeutig zu sein, steht auch so in der Doku.
equals dagegen sollte einem sagen ob es sich um "dasselbe oder das gleiche" handelt, ersteres durch ==, letzteres durch vergleich der Werte.
 

tfa

Top Contributor
Ist ja auch klar, es gibt nur einen endlichen Zahlenraum für (theoretisch) unendlich viele Objekte.

Code:
System.identityHashCode(Object)
wird daran auch nichts ändern, da hat man auch nur nen endlichen Zahlenraum.

Das ist natürlich richtig. Allerdings hast du auch nur endlich viele Objekte in der VM. Der Name "System.identityHashCode" suggeriert, dass hiermit wenigstens eindeutige Codes möglich sind. Den Bug 6321873 kannte ich allerdings noch nicht.
 

tfa

Top Contributor
Wobei doch ein Vergleich der System.identityHashCodes einem == gleich kommt oder?

Wohl doch nicht:

Java:
 Object obj = new Object();
 int hash = System.identityHashCode(obj);
 Object dup;
 do {
     dup = new Object();
 } 
 while (System.identityHashCode(dup) != hash);

 System.out.println(obj+", "+dup+"     identity=="+(obj==dup));

-> [c]java.lang.Object@18d107f, java.lang.Object@18d107f identity==false
[/c]
 

Enternix

Mitglied
Vielen Dank für eure Antworten! Ich werde wohl den Weg über die UUIDs gehen.

Trotzdem würde mich interessieren, wozu die hashCode()-Methode (bzw. System.identityHashCode(Object)) gut sein soll, wenn sie nichts (zumindest nicht hundertprozentig) über die Identität von Objekten aussagt. Das verstehe ich irgendwie nicht so recht. Wo könnte man die hashCode-Methode sinnvoll einsetzen?
 
G

Gast2

Gast
Die Methode hashCode() wird bspw. von Collections genutzt. Als Beispiel die HashMap. Durch den Hashcode hat man die Möglichkeit schnell ein Objekt wiederzufinden.
 

Enternix

Mitglied
Verstehe ich das richtig, dass die Collections intern hashCode() benutzen, um ein Element zu finden und anschließend noch einmal per equals() überprüfen, ob es sich (z.B. nach get()) tatsächlich um das gesuchte Element handelt?
 
S

SlaterB

Gast
genau, hashCode() schränkt um einen Faktor in Millionenhöhe schnell ein, den kleinen Rest kann man gemütlich mit equals durchgehen
 
M

maki

Gast
Verstehe ich das richtig, dass die Collections intern hashCode() benutzen, um ein Element zu finden und anschließend noch einmal per equals() überprüfen, ob es sich (z.B. nach get()) tatsächlich um das gesuchte Element handelt?
Ja.

Nicht alle Collections/Maps übrigens, nur die, die "Hash" im Namen führen ;)
 
S

Spacerat

Gast
Wie wäre es mit long-hashCodes als UUID?
Java:
Object test = new Object();
long uuid = (((long) test.getClass().getName().hashCode()) << 32) | System.identityHashCode(test);
Endlicher Zahlenraum für unendlich viele Objekte bleibt natürlich bestehen, aber immerhin schon mehr möglich, als mit int.
BTW.: Hashmaps benutzen equals erst dann, wenn zwei Objekte innerhalb einer Hashgruppe auftauchen, sprich, zwei Objekte den selben Hashcode haben. Eine Ausnahme ist die IdentityHashMap, welche Objekte ausschliesslich per Identität (==) unterscheidet und weder hashCode noch equals verwendet.
 
Zuletzt bearbeitet von einem Moderator:

Mujahiddin

Top Contributor
Es ist übrigens üblicherweise so, dass man die hashCode()-Methode überschreibt. Da der native hashCode (zumindest steht das so in der API) die interne Speicheradresse beinhaltet, kann sie von Laufzeit zu Laufzeit variieren. Sprich: wenn du deine HashMap serialisierst, und ausliest, kriegst du einen ordentlichen Salat.

Jetzt habe ich aber noch eine Frage:
Ich habe mal diesen HashClash ausgeführt und mir ist folgendes aufgefallen:
Java:
public static void main(String[] args) throws Exception {
	final Object obj = new Object();
	System.out.println(obj);
}
Wenn man diesen Code öfter hintereinander ausführt, kommt ziemlich oft (aber nicht immer) der gleiche Hashcode (also auch über verschiedene Laufzeiten hinweg)... Weiß jemand, woran das liegt?
Also anscheinend hat ja hashCode() nur indirekt was mit der Speicheradresse zu tun - sonst wären Kollisionen innerhalb einer Laufzeit ja unmöglich. Aber könnte es sein, dass der hashCode() die java-interne Speicheradresse ausgibt und nicht die globale (also des ganzen X GB RAM, die einer hat)? Und da "obj" das erste Object ist, das die JVM erzeugt, belegt sie (mehr oder weniger) logischerweise einen der ersten "Plätze" und hat oft den gleichen hashCode.

@Spacerat:
Das wäre wohl nur nützlich, wenn man verschiedene Klassen hat...
 
Zuletzt bearbeitet:
S

Spacerat

Gast
@Mujahiddin: Also für die Berechnung des Hashcodes wird schon die globale Speicheradresse herangezogen. Diese kann aber (und das nicht nur in Java) ziemlich oft die selbe sein, zumindest wenn man ein Programm öfters hintereinander startet. Könnte mit irgendwelchen Cache-Mechanismen der CPU bzw. dessen Speichermanagern zusammen hängen.
Von wegen der Nützlichkeit meiner Idee... So wie's da steht hast du recht. Wie man die höherwertigen Bytes dieses Hashes berechnet, ist aber keinesfalls vorgeschrieben.
 
Zuletzt bearbeitet von einem Moderator:

FArt

Top Contributor
[OT]@Mujahiddin
Du musst ja Zeit haben ;-)
Endlich mal wieder jemand, der das Forum als Forum nutzt, neugierig ist und hinterfrag, und das Forum nicht nur als billige Hilfe gebraucht.
[/OT]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Größe einer CD ermitteln Allgemeine Java-Themen 10
multiholle Aufrufer einer Funktion ermitteln Allgemeine Java-Themen 13
G genauen Typ einer generischen Klasse zur Laufzeit ermitteln Allgemeine Java-Themen 2
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
H Speicheverbrauch einer Datenstruktur ermitteln Allgemeine Java-Themen 29
C Ermitteln einer Funktionsgleichung Allgemeine Java-Themen 11
M Erstes Element einer Enumeration ermitteln Allgemeine Java-Themen 6
I Druckerauflösung per JNA ermitteln Allgemeine Java-Themen 3
Kiki01 Häufigster Buchstabe lässt sich nicht ermitteln Allgemeine Java-Themen 30
S Verwendet Programmiersprache aus Quellcode - Datei ermitteln Allgemeine Java-Themen 6
B Dateistart ermitteln Allgemeine Java-Themen 14
MiMa Geldbetrag mit regex ermitteln. Allgemeine Java-Themen 14
S Alle Dateinamen ermitteln Allgemeine Java-Themen 22
S Marker aus String ermitteln Allgemeine Java-Themen 5
B Mail: Nicht vorhandener Empfänger ermitteln Allgemeine Java-Themen 4
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
C Ermitteln ob Zeitumstellung war Allgemeine Java-Themen 37
KeexZDeveoper Nächstgelegenden Wert ermitteln Allgemeine Java-Themen 5
D Best Practice Die niedrigste Differenz zwischen zwei Listen ermitteln. Allgemeine Java-Themen 10
L Wachstumsordnung der Ausführungszeit ermitteln Allgemeine Java-Themen 7
MiMa MP3 Bitrate ermitteln Allgemeine Java-Themen 7
Aruetiise Interface Position durch JButton ermitteln Allgemeine Java-Themen 5
L Ermitteln der Anzahl an Lösungen von quatratischen Gleichungen (Sieb von Atkin) Allgemeine Java-Themen 1
L Java Version aus Tomcat ermitteln Allgemeine Java-Themen 3
F Content-Disposition ermitteln über URL Allgemeine Java-Themen 2
O MVC - wo Liste der ComboBox-Items ermitteln Allgemeine Java-Themen 3
F Zeit ermitteln Allgemeine Java-Themen 2
J ermitteln der Anzahl der Monate Allgemeine Java-Themen 7
F Swing selektierte Komponente ermitteln Allgemeine Java-Themen 4
S Einfache Methode die Groesse eines Objekts zu ermitteln? Allgemeine Java-Themen 12
L Jsp: Vorherige Webseite ermitteln Allgemeine Java-Themen 4
K Annotations der aufrufenden Methode ermitteln Allgemeine Java-Themen 11
S per Mausklick Position ermitteln Allgemeine Java-Themen 8
T HTML Tag Position mittels Pattern ermitteln Allgemeine Java-Themen 7
K Datum ermitteln Allgemeine Java-Themen 4
R Array Schnittmenge performant ermitteln Allgemeine Java-Themen 8
M Klassen in vielen Jars ermitteln Allgemeine Java-Themen 2
c_sidi90 Routine zum ermitteln des Standardablageverzeichnisses Allgemeine Java-Themen 2
R Windows ermitteln ob Administratorrechte vorhanden Allgemeine Java-Themen 17
E Java Browser ermitteln? Allgemeine Java-Themen 6
F Pfad der laufenden JAR ermitteln (mit Archivnamen) Allgemeine Java-Themen 2
E Java Version Details ermitteln Allgemeine Java-Themen 5
E Performace/Ausführungszeit von Methoden ermitteln Allgemeine Java-Themen 4
J Anwendungen ermitteln ? Allgemeine Java-Themen 5
Iron Monkey Lautstärkeregelung ermitteln Allgemeine Java-Themen 2
A Reisezeiten ermitteln Allgemeine Java-Themen 9
Z Position/Größe von Windows-Fenstern ermitteln Allgemeine Java-Themen 12
S Konstruktor ermitteln Allgemeine Java-Themen 3
Iron Monkey Anzahl der Monate ermitteln Allgemeine Java-Themen 17
FoolMoon Elegante Möglichkeit die kleinste Zahl zu ermitteln. Allgemeine Java-Themen 7
T Pfad Anwendungsdaten unter Windows ermitteln Allgemeine Java-Themen 3
D Häufigkeit eines Zeichens ermitteln Allgemeine Java-Themen 5
H2SO3- Pixel länge von String ermitteln Allgemeine Java-Themen 4
D Parametername ermitteln Allgemeine Java-Themen 10
T Nicht verwendete Klassen in Projekten ermitteln? Allgemeine Java-Themen 2
data89 [Kurze Frage] Ähnlichkeit zweier Strings ermitteln Allgemeine Java-Themen 19
T zu Beginn der main: Heap space ermitteln und hochsetzen Allgemeine Java-Themen 11
M Grösse von BorderLayout.CENTER ermitteln Allgemeine Java-Themen 8
G Ermitteln des aufrufenden Objekts Allgemeine Java-Themen 5
G Zeigeranzahl ermitteln Allgemeine Java-Themen 10
S E-Mail-Links: geklickten Link ermitteln Allgemeine Java-Themen 4
D Ahängige Bibliotheken (JARs) ermitteln Allgemeine Java-Themen 6
G restlichen freien Speicher ermitteln? Allgemeine Java-Themen 3
S Hintergrundname eines Buttons ermitteln Allgemeine Java-Themen 3
T Eigene PID ermitteln! Allgemeine Java-Themen 3
M Aus Anzahl Tagen Datum ermitteln Allgemeine Java-Themen 8
S Nicht aufgerufene Methoden in Eclipse ermitteln Allgemeine Java-Themen 18
G größten gemeinsamen Teiler ermitteln Allgemeine Java-Themen 11
V Image laden - URL über ClassLoader ermitteln Allgemeine Java-Themen 2
J zeit überscheidungen ermitteln Allgemeine Java-Themen 6
G PPI von Monitor ermitteln Allgemeine Java-Themen 9
Y Mit Java Betriebssystem ermitteln Allgemeine Java-Themen 6
J Kann eigene Klasse nicht ermitteln Allgemeine Java-Themen 4
O Inhalt vom JTextfield im DebugMode ermitteln? Allgemeine Java-Themen 2
A Jahr ermitteln Allgemeine Java-Themen 2
A Installierte Runtime ermitteln Allgemeine Java-Themen 3
M Nummer eine Componente in JScrollPane ermitteln Allgemeine Java-Themen 4
C Pixelanzahl eines Strings ermitteln Allgemeine Java-Themen 12
J Speicherverbrauch des Systems ermitteln Allgemeine Java-Themen 4
M Zeit eines rechners im netzwerk ermitteln Allgemeine Java-Themen 6
F Implementierte Interfaces ermitteln Allgemeine Java-Themen 6
M Bibliotheksname zur Laufzeit ermitteln (Classloader) Allgemeine Java-Themen 7
foobar Angemeldeten Systembenutzer ermitteln Allgemeine Java-Themen 8
P Java installationsverzeichnis ermitteln, wie? Allgemeine Java-Themen 4
C RTF - Dateipfad ermitteln Allgemeine Java-Themen 4
U Arbeitsspeicher ermitteln? Allgemeine Java-Themen 18
W java.io.file Originalziel bei .lnk ermitteln? Allgemeine Java-Themen 5
T OutputStream - Prozente ermitteln Allgemeine Java-Themen 3
M Den Pfad ermitteln aus dem die .jar Datei gestartet wurde Allgemeine Java-Themen 2
I Anwendungspfad ermitteln Allgemeine Java-Themen 4
S Programmname ermitteln Allgemeine Java-Themen 6
W Beziehungen zwischen Usern ermitteln Allgemeine Java-Themen 2
vogella Version von Java ermitteln Allgemeine Java-Themen 2
F JRE Version ermitteln Allgemeine Java-Themen 2
G Dateigröße ermitteln Allgemeine Java-Themen 4
C Generic Type ermitteln Allgemeine Java-Themen 3
R Menge an Bytes eines OutputStreams ermitteln. Allgemeine Java-Themen 6
R Fileendung ermitteln Allgemeine Java-Themen 2
G datentyp ermitteln Allgemeine Java-Themen 8
K Java Version ermitteln (über System.getProperty hinaus) Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben