2010-03-15 16 views
18

मैं GetHashCode फ़ंक्शन में शून्य फ़ील्ड से कैसे निपटूं?नल फ़ील्ड पर GetHashCode?

Module Module1 
    Sub Main() 
    Dim c As New Contact 
    Dim hash = c.GetHashCode 
    End Sub 

    Public Class Contact : Implements IEquatable(Of Contact) 
    Public Name As String 
    Public Address As String 

    Public Overloads Function Equals(ByVal other As Contact) As Boolean _ 
     Implements System.IEquatable(Of Contact).Equals 
     Return Name = other.Name AndAlso Address = other.Address 
    End Function 

    Public Overrides Function Equals(ByVal obj As Object) As Boolean 
     If ReferenceEquals(Me, obj) Then Return True 

     If TypeOf obj Is Contact Then 
     Return Equals(DirectCast(obj, Contact)) 
     Else 
     Return False 
     End If 
    End Function 

    Public Overrides Function GetHashCode() As Integer 
     Return Name.GetHashCode Xor Address.GetHashCode 
    End Function 
    End Class 
End Module 
+0

XORing हैश कोड के संयोजन के लिए एक अच्छा तरीका नहीं है। अधिक मजबूत दृष्टिकोण के लिए, http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode –

उत्तर

3

जैसा कि जेफ येट्स ने सुझाव दिया था, उत्तर में ओवरराइड उसी नाम है (नाम = शून्य, पता = "foo") के रूप में (name = "foo", address = null)। इन्हें अलग होना चाहिए। जैसा कि लिंक में सुझाया गया है, निम्न के जैसा कुछ बेहतर होगा।

public override int GetHashCode() 
{ 
    unchecked // Overflow is fine, just wrap 
    { 
     int hash = 17; 
     hash = hash * 23 + (Name == null ? 0 : Name.GetHashCode()); 
     hash = hash * 23 + (Address == null ? 0 : Address.GetHashCode()); 
    } 
    return hash; 
} 

What is the best algorithm for an overridden System.Object.GetHashCode?

30

आमतौर पर, आप अशक्त के लिए जाँच करें और यदि फ़ील्ड रिक्त है कि हैश कोड की "भाग" के लिए 0 का उपयोग करें:

return (Name == null ? 0 : Name.GetHashCode())^
    (Address == null ? 0 : Address.GetHashCode()); 

(सी # -ism क्षमा, अशक्त बारे में सुनिश्चित नहीं वीबी में समकक्ष की जांच करें)

+0

एनपी 'csism' के बारे में देखें। आपने अभी स्पष्ट किया है कि शून्य के लिए हैश कोड 0. – Shimmy

+0

बीटीडब्ल्यू है, यदि विशिष्ट क्षेत्र एक int है, तो क्या मैं अपने हैशकोड की बजाय int को वापस कर सकता हूं? क्या यह एक बुरा विचार होगा? यानी वापसी ID^(नाम == शून्य? 0: नाम। गेटहाशकोड) (यह एक int है)? – Shimmy

+2

हैश कोड के लिए एकमात्र आवश्यकता यह है कि समान वस्तु बराबर हैश कोड लौटाती है। चूंकि बराबर स्याही बराबर होती है, इसलिए int को अपने ही हैश कोड के रूप में वापस करना ठीक है। दरअसल, यह वही है जो Int32.GetHashCode ऐसा प्रतीत होता है ...! – itowlson

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^