Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

2 Hashwerte das gleiche Objekt? [VB.net]

Empfohlene Antworten

Veröffentlicht

Hi, ich hab eben mal wieder ne Seltsamkeit gefunden,

ich hab mir eine Grafische Oberfläche aufgebaut in der man sämmtliche Mitarbeiter eines Projekts sehen kann.

Da es nicht möglich sein soll, 2mal die gleiche Mitarbeiter-Rolle-Projekt kombi in der Datenbank zu haben, hab ich vor dem Speichern eine Abfrage eingebaut, die durchtestet ob sich durch eine Änderung oder das hinzufügen eines Neuen Mitarbeiters zum Projekt eine Inkonsitenz ergeben hat.

das tut die Methode in dem sie für jede Row in dem Tabellayout der Groupboxen(für die Unterschiedlichen Rollenkategorien[Verwaltung,Produktion, etc]) ein Objekt folgender Klasse erstellt:

Public Class valueTrippel(Of typ1, typ2, typ3)

    Public val1 As typ1

    Public val2 As typ2

    Public val3 As typ3

    Public Overrides Function Equals(obj As Object) As Boolean

        If obj.GetType.Equals(Me.GetType) Then

            Dim castedobj As valueTrippel(Of typ1, typ2, typ3) = CType(obj, valueTrippel(Of typ1, typ2, typ3))

            'Same Class but different variableTypes

            If Not (castedobj.val1.GetType.Equals(val1.GetType) AndAlso castedobj.val2.GetType.Equals(val2.GetType) AndAlso castedobj.val3.GetType.Equals(val3.GetType)) Then

                Return False

            End If

            Dim vg1 As Boolean = castedobj.val1.Equals(Me.val1)

            Dim vg2 As Boolean = castedobj.val2.Equals(Me.val2)

            Dim vg3 As Boolean = castedobj.val3.Equals(Me.val3)

            If (vg1 AndAlso vg2 AndAlso vg3) Then

                Return True

            End If

        End If

        Return False

    End Function

    Public Overrides Function GetHashCode() As Integer

        Dim hc As Integer = (val1.ToString & val2.ToString & val3.ToString).GetHashCode

        Return hc

    End Function

End Class
Die Rows können hierbei entweder 3 Lables oder aber eine checkbox und 2 spezialComponenten enthalten, welche ähnlich einer Combobox ein SelectedItem haben. Der eigentliche Consistenzcheck erfolgt dann so:
 

Private Function SavePrecheck() As Boolean

        Dim trippellist As New Dictionary(Of valueTrippel(Of Projekt, Rollen_Typen, Mitarbeiter), Control())

        Dim successfull As Boolean = True

        Dim doubles As String = ""

        For Each kat As Rollen_Kategorien In ControlsDict.Keys

            For Each Cont As Control() In ControlsDict(kat).Values

                If Not (Cont(1).GetType.Equals(GetType(TeamComboBox))) Then

                    Continue For

                End If

                Dim trippel As New valueTrippel(Of Projekt, Rollen_Typen, Mitarbeiter) With {.val1 = project, .val2 = CType(CType(Cont(1), TeamComboBox).SelectedItem, Rollen_Typen), .val3 = CType(Cont(2), EmployeeButton).Employee}

                If Not trippellist.ContainsKey(trippel) Then

                    trippellist.Add(trippel, Cont)

                Else

                    successfull = False

                    doubles += trippel.val2.ToString & trippel.val3.ToString & vbNewLine

                End If

            Next

        Next

        If Not successfull Then

            MsgBox("Error: At least one Entry was more then ones in the View, the values were:" & vbNewLine & doubles & "please fix this inconsistence before saving", MsgBoxStyle.Critical, "Error")

        End If

        Return successfull

    End Function

Jetzt tauch hier aber ein komischer Hashwert fehler in der zeile

If Not trippellist.ContainsKey(trippel) Then

auf.

Ich bin hier mehrmals im Debuger durchgegangen, und zuerst geht die ContainsKey-Methode ja immer in getHashcode.

Hier jedoch kommt bei 2 Objekten bei denen die Variablen val1-val3 jeweils identisch sind unterschiedliche Hashwerte. Wie kann das sein?

Einmal bekomm ich: -1597763128 und einmal -590045485

Die ToString Methoden sind sauber überschieben, und liefern jeweils den Projektnamen, Rollennamen und Mitarbeiternamen zurück

Gruß Lucas

  • Autor

Ok, das ist zwar keine vernünftige erklärung in meinen Augen, aber es kam vom Rollennamen. Nach dem ich hier hinter die .toString-methode ein Trim ran gehängt hab hat es funktioniert. Die rolle für dich ich den fehler bekommen hatte, hatte auch einen Whitespace in der Mitte, aber warum hat das den Hashcode beeinflust wenn ich ein Trim dahinter hänge? eigentlich sollte doch .toString, wenn ich es an den Namen der Rolle hänge, immer den gleichen Text liefern und da garnicht selbst dran rum pfuschen oder?

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.