471,071 Members | 1,358 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,071 software developers and data experts.

Object identity

A simple question hopefully...

Can the Object GetHashCode() method be used to obtain a unique
identifier for an instance of an object?

To put this another way, what does the Object.ReferenceEquals() shared
method use for its comparison?

In Python, a unique identifier can be obtained with: id(object)

Thanks,
Daniel Klein
Nov 20 '05 #1
6 1129
I was asking a similar question, here it is and a good response I got from
it.

Regards - OHM

-----------------
The help for the .NET Framework Class Library tells us that the
Object.GetHashCode() Method does not guarantee uniqueness' or consistency
and that overriding this and the Equals method is a good idea.

It also tells us that using the XOR functions on two or more Fields or
Properties is an acceptable way to achieve this.

What do you guys think is the best approach to this given that generating a
hashcode should be fast as well as consistant.
---------------

OHM,
When I'm defining classes that I want to be "HashTable friendly" I do both
of what you quoted, the general template I follow is:

Public NotInheritable Class KeyPair

Private ReadOnly m_key1, m_key2 As Integer

Public Sub New(ByVal key1 As Integer, ByVal key2 As Integer)
m_key1 = key1
m_key2 = key2
End Sub

Public Overrides Function GetHashCode() As Integer
Return m_key1.GetHashCode() Xor m_key2.GetHashCode()
End Function

Public Overloads Function Equals(ByVal other As KeyPair) As Boolean
Return m_key1 = other.m_key1 AndAlso m_key2 = other.m_key2
End Function

Public Overloads Overrides Function Equals(ByVal obj As Object) As
Boolean
If TypeOf obj Is KeyPair Then
Return Me.Equals(DirectCast(obj, KeyPair))
Else
Return False
End If
End Function

End Class

Note that there may be more "key" fields, and there may be non "key" fields
also. Normally I make the "key" fields immutable (ReadOnly) to ensure that
the HashCode does not change causing problems for the HashTable itself. In a
couple cases I notify the container (HashTable) that a "key" is changing, so
that it can remove the old key and add the new key.

Remember that the HashCode gives the HashTable a slot to put the item into,
that the HashTable then uses the Equals function to see if the item is
already in that slot. In other words a single slot can have multiple items.
Also there are other "requirements" that make a good hash code, however I'm
taking it on faith that the primitive types return good hash codes. By
making my types build upon the primitive types, my types should also have
fairly good hash codes...

Hope this helps
Jay

"One Handed Man [ OHM# ]" <O_H_M{at}BTInternet{dot}com> wrote in message
news:%2****************@tk2msftngp13.phx.gbl...
The help for the .NET Framework Class Library tells us that the
Object.GetHashCode() Method does not guarantee uniqueness' or consistency
and that overriding this and the Equals method is a good idea.

It also tells us that using the XOR functions on two or more Fields or
Properties is an acceptable way to achieve this.

What do you guys think is the best approach to this given that generating a
hashcode should be fast as well as consistant.

--
Daniel Klein wrote:
A simple question hopefully...

Can the Object GetHashCode() method be used to obtain a unique
identifier for an instance of an object?

To put this another way, what does the Object.ReferenceEquals() shared
method use for its comparison?

In Python, a unique identifier can be obtained with: id(object)

Thanks,
Daniel Klein


--
Best Regards - OHM

O_H_M{at}BTInternet{dot}com
Nov 20 '05 #2
Daniel,
Can the Object GetHashCode() method be used to obtain a unique
identifier for an instance of an object?
No

To put this another way, what does the Object.ReferenceEquals() shared
method use for its comparison?


It does something like

Return (obj1 Is obj2)

Mattias

--
Mattias Sjögren [MVP] mattias @ mvps.org
http://www.msjogren.net/dotnet/ | http://www.dotnetinterop.com
Please reply only to the newsgroup.
Nov 20 '05 #3
Daniel,
Can the Object GetHashCode() method be used to obtain a unique
identifier for an instance of an object? No, OHM gave all the reasons (I know of) that it cannot.
To put this another way, what does the Object.ReferenceEquals() shared
method use for its comparison? The actual "address" of the object on the heap.

Remember that reference type variables (aka Objects) are actually a
reference (pointer/memory address) to the object data itself on the heap,
Object.ReferenceEquals compares these two pointers.
In Python, a unique identifier can be obtained with: id(object) After you get this unique identifier, what are you doing with it?

I find for most reference types the object reference itself is sufficient
for a unique identifier, normally when I need a different unique identifier,
is when I am mapping the object back to a Database or something "concrete"
that needs to be logically persisted as opposed to physically persisted (an
ASP.NET session)...

Hope this helps
Jay

"Daniel Klein" <da*****@aracnet.com> wrote in message
news:0n********************************@4ax.com... A simple question hopefully...

Can the Object GetHashCode() method be used to obtain a unique
identifier for an instance of an object?

To put this another way, what does the Object.ReferenceEquals() shared
method use for its comparison?

In Python, a unique identifier can be obtained with: id(object)

Thanks,
Daniel Klein

Nov 20 '05 #4
On Sun, 11 Jan 2004 12:52:58 -0600, "Jay B. Harlow [MVP - Outlook]"
<Ja************@msn.com> wrote:
In Python, a unique identifier can be obtained with: id(object)

After you get this unique identifier, what are you doing with it?


The Python application I'm converting from is using it as a temporary
database key. It's really no problem changing this to something like a
sequential number.

Thanks for the feedback,

Daniel Klein
Nov 20 '05 #5
Daniel,
I would recommend either a sequential number of a System.GUID. The GUID
would significantly reduce the chance of a key conflict.

I don't know off hand of any built-in support for Python's id function.

Hope this helps
Jay

"Daniel Klein" <da*****@aracnet.com> wrote in message
news:1h********************************@4ax.com...
On Sun, 11 Jan 2004 12:52:58 -0600, "Jay B. Harlow [MVP - Outlook]"
<Ja************@msn.com> wrote:
In Python, a unique identifier can be obtained with: id(object)

After you get this unique identifier, what are you doing with it?


The Python application I'm converting from is using it as a temporary
database key. It's really no problem changing this to something like a
sequential number.

Thanks for the feedback,

Daniel Klein

Nov 20 '05 #6
In article <1h********************************@4ax.com>, Daniel Klein wrote:
On Sun, 11 Jan 2004 12:52:58 -0600, "Jay B. Harlow [MVP - Outlook]"
<Ja************@msn.com> wrote:
In Python, a unique identifier can be obtained with: id(object)

After you get this unique identifier, what are you doing with it?


The Python application I'm converting from is using it as a temporary
database key. It's really no problem changing this to something like a
sequential number.

Thanks for the feedback,

Daniel Klein


Question?... Does it really need to be converted from python?
ActiveState has a python compiler for .NET (perl as well). I haven't
tried it, but you may want to check it out :) Might save you a lot of
trouble.

--
Tom Shelton
MVP [Visual Basic]
Nov 20 '05 #7

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

1 post views Thread by Clemens Hoffmann | last post: by
1 post views Thread by SR | last post: by
2 posts views Thread by k | last post: by
11 posts views Thread by Amit Agarwal | last post: by
11 posts views Thread by Stephan Keil | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.