Eindeutige ObjectIDs generieren

Thomas Darimont

Erfahrenes Mitglied
Hallo,

hier mal ein Beispiel wie man eindeutige ObjectID's zur Laufzeit erzeugen lassen kann.
(Ich vermute mal, dass Visual Studio intern den selben Mechanismus benutzt : http://www.tutorials.de/forum/net-c...io-net-objekt-instanzen-taggen-markieren.html )
C#:
            bool wasNew = false;
            System.Runtime.Serialization.ObjectIDGenerator objectIdGenerator = new System.Runtime.Serialization.ObjectIDGenerator();
            Console.WriteLine(objectIdGenerator.GetId("hallo", out wasNew));
            Console.WriteLine(wasNew);
            Console.WriteLine(objectIdGenerator.GetId("hallo", out wasNew));
            Console.WriteLine(wasNew);

            Console.WriteLine(objectIdGenerator.GetId(new Object(), out wasNew));
            Console.WriteLine(wasNew);

Ausgabe:
Code:
1
True
1
False
2
True

Eine weitere Möglichkeit eine eindeutige Repräsentation einer Instanz zu bekommen ist die GethashCode()-Methode von Object. Wie man die GethashCode() Methode von Object auch bei überschriebenen GetHashCode Methoden aufrufen kann findet man hier:
http://www.tutorials.de/forum/net-cafe/262593-der-identity-hashcode-von-objekten.html

Gruß Tom
 
Vorsicht:
The default implementation of the GetHashCode method does not guarantee unique return values for different objects.

Zudem ist es auch insofern gefährlich, als dass man bei der Verwendung eines 3rd Party Frameworks nicht weiß, ob GetHashCode überschrieben wurde, oder ob die Standardimplementierung verwendet wird.
 
Hallo,

interessant...
The default implementation of the GetHashCode method does not guarantee unique return values for different objects. Furthermore, the .NET Framework does not guarantee the default implementation of the GetHashCode method, and the value it returns will be the same between different versions of the .NET Framework. Consequently, the default implementation of this method must not be used as a unique object identifier for hashing purposes.

http://msdn2.microsoft.com/en-us/library/system.object.gethashcode.aspx

Das heißt also System.Object.GetHashCode() kann für unterschiedliche Instanzen den selben HashCode liefern. In Java liefert java.lang.Object.hashCode() für jede Objektinstanz einen eindeutigen Wert.

http://java.sun.com/javase/6/docs/api/java/lang/Object.html#hashCode()
As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)

Kleiner aber feiner Unterschied, danke für den Hinweis :)

Gruß Tom
 
Zurück