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;
小说推荐
- oracle从入门到精通(PDF格式)
- -Page 1-Oracle 从入门到精通-Page 2-资源来自网络,仅供学习 Oracle 从入门到精通一、SQL 8
- 最新章:第37章
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 最新章:第4章
- Java编程思想第4版[中文版](PDF格式)
- -Page 1-Page 2《Thinking In Java》中文版作者:Bruce Eckel主页:http/BruceEckel.编译:Trans Bot主页:http/memberease~transbot致谢-献给那些直到现在仍在孜孜不倦创造下一代计算机语言的人们!指导您利用万维网的语言进
- 最新章:第295章
- 深入浅出MFC第2版(PDF格式)
- -Page 1-Page 2-山高月小山高月小 水落石出水落石出山高月小山高月小 水落石出水落石出-Page 3-深入淺出MFC(第版 使用Visual C 5.0 MFC 4.2)Dissecting MFC(Second Edition Using Visual C 5.0 MFC 4.2)侯俊
- 最新章:第309章
- VC语言6.0程序设计从入门到精通
- -Page 1-Visual C 6.0 程序设计从入门到精通求是科技 王正军 编著
- 最新章:第136章
- SQL 21日自学通(V3.0)(PDF格式)
- -Page 1-SQL 21 日自学通(V1.0 翻译人 笨猪目录目录 1译者的话 14第一周概貌 16从这里开始 16
- 最新章:第170章
- 2008年青年文摘精编版
- 作者:中国青年出版社“初恋”的惩罚.作者:凡 凡 文章来源《真情》2005年第4期 点击数:6608 更新时间:2005-6-5过了年,我就十八岁了。离高考只剩下四个多月了。这一段,班里的男女生相互间递纸条、写情书、约会等地下活动慢慢的多了起来。我这个“尖子生”也突然感到了不安、慌乱,并且自责。不知
- 最新章:第230章
- JMS简明教程(PDF格式)
- -Page 1-JMS1.1规范中文版卫建军2007‐11‐22-Page 2
- 最新章:第28章
- SQL语言艺术(PDF格式)
- -Page 1-SQLSSQQLL语言艺术内容介绍本书分为12章,每一章包含许多原则或准则,并通过举例的方式对原则进行解释说明。这些例子大多来自于实际案例,对九种SQL经典查询场景以及其性能影响讨论,非常便于实践,为你数据库应用维护人员阅读。资深 SQL 专家 Stéphane Faroult倾力打
- 最新章:第27章