《VB2008从入门到精通(PDF格式英文版)》第133章


The MSDN documentation for Object。GetHashCode defines the GetHashCode() method as follows
(http://msdn2。microsoft。/en…us/library/system。object。gethashcode(VS。90)。aspx): 
The GetHashCode method can be overridden by a derived type。 Value types must over
ride this method to provide a hash function that is appropriate for that type and to 
provide a useful distribution in a hash table。 For best results; the hash code must be 
based on the value of an instance field or property instead of a static field or property。
Objects used as a key in a Hashtable object must also override the GetHashCode method 
because those objects must generate their own hash code。 If an object used as a key does 
not provide a useful implementation of GetHashCode; you can specify a hash code 
provider when the Hashtable object is constructed。 
But what does this actually mean? The purpose of GetHashCode() is to identify the object in
a collection of other objects using a hash code。 Imagine creating a table of same…type instances。
The situation occurs when you create a collection and store a bunch of instances in the collec
tion。 With the GetHashCode() method; you can generally separate each instance from each other。
I say “generally” because GetHashCode() is an approximation。 To verify if one object instance
equals another; the Equals() method needs to be implemented。 
…………………………………………………………Page 302……………………………………………………………
280 CH AP T E R 1 0 ■ L E A R N I N G A B OU T P E R S IS TE N CE 
Implementing a hash code is best delegated to a helper class that does the heavy lifting。
The book Effective Java Programming Language Guide by Joshua Bloch (Prentice…Hall; 2001)
outlines a robust technique。 Basically; you store some constant nonzero value; such as 17; in
a variable。 Then; for each data member of the type; perform a mathematical operation that
results in Integer values that are successively multiplied and added; where the operation is
specific to the type and defined as follows: 
o Boolean: If true return 0; otherwise return 1。 
o Byte; Char; Short; or Integer: Return the value of the type。 
o Long: Return CInt(value Xor (value 》》 &H20))。 &H20 is the hexadecimal for 32。 
o Single: Return Convert。ToInt32 of the value。 
o Object: Return the value generated by calling Object。GetHashCode()。 
o Array : Iterate and treat each element individually。 
The rules are implemented in a class called HashCodeAutomater。 The following source code
is an implementation in an abbreviated form: 
Public Class HashCodeAutomater 
Private Readonly _constant As Integer 
Private _runningTotal As Integer 
Public Sub New() 
_constant = &H25 
_runningTotal = &H11 
End Sub 
Public Function AppendSuper(ByVal superHashCode As Integer) As HashCodeAutomater 
_runningTotal = ((_runningTotal * _constant) + superHashCode) 
Return Me 
End Function 
Public Function Append(ByVal obj As Object) As HashCodeAutomater 
If (obj Is Nothing) Then 
Me。_runningTotal = (Me。_runningTotal * Me。_constant) 
ElseIf Not obj。GetType。IsArray Then 
Me。_runningTotal = ((Me。_runningTotal * Me。_constant) + obj。GetHashCode) 
ElseIf TypeOf obj Is Long() Then 
Me。Append(DirectCast(obj; Long())) 
ElseIf TypeOf obj Is Integer() Then 
Me。Append(DirectCast(obj; Integer())) 
ElseIf TypeOf obj Is Short() Then 
Me。Append(DirectCast(obj; Short())) 
ElseIf TypeOf obj Is Char() Then 
Me。Append(DirectCast(obj; Char())) 
…………………………………………………………Page 303……………………………………………………………
CH A PT E R 1 0 ■ L E A R N I N G A B O U T P E R S IS T E N CE 281 
ElseIf TypeOf obj Is Byte() Then 
Me。Append(DirectCast(obj; Byte())) 
ElseIf TypeOf obj Is Double() Then 
Me。Append(DirectCast(obj; Double())) 
ElseIf TypeOf obj Is Single() Then 
Me。Append(DirectCast(obj; Single())) 
ElseIf TypeOf obj Is Boolean() Then 
Me。Append(DirectCast(obj; Boolean())) 
Else 
Me。Append(DirectCast(obj; Object())) 
End If 
Return Me 
End Function 
Public Function Append(ByVal array As Long()) As HashCodeAutomater 
If (array Is Nothing) Then 
Me。_runningTotal = (Me。_runningTotal * Me。_constant) 
Else 
Dim i As Integer 
For i = 0 To array。Length 1 
Me。Append(array(i)) 
Next i 
End If 
Return Me 
End Function 
Public Function Append(ByVal value As Long) As HashCodeAutomater 
Me。_runningTotal = _ 
((Me。_runningTotal * Me。_constant) + CInt((value Xor (value 》》 &H20)))) 
Return Me 
End Function 
Public Function ToHashCode() As Integer 
Return _runningTotal 
End Function 
End Class 
The different implementations of the Append() method belong to a single grouping for a
single data type; Long。 For example; there is an Append() method that accepts a Long and a Long
array。 The full implementation of HashCodeAutomater would have an Append() method for Short
and Short array; and all the other data types。 There is no specific group implementation for the
String type;
小说推荐
返回首页返回目录