2009-04-04 11 views
0

Weiß jemand, warum der folgende Code andere Ergebnisse auf einigen Computern zurückgibt?Computing-Datei HASH gibt verschiedene Werte zurück

Private Shared Function ComputeHashValue(ByVal Data As String) As String 
    Dim HashAlgorithm As SHA512 = SHA512.Create 
    Dim HashValue() As Byte = HashAlgorithm.ComputeHash(Encoding.ASCII.GetBytes(Data)) 
    ' Looping over the array and ANDing each byte with 0111111 
    For i As Integer = 0 To HashValue.Length - 1 
     HashValue(i) = HashValue(i) And Convert.ToByte(127) 
    Next 
    Return Encoding.ASCII.GetString(HashValue) 
End Function 

Private Shared Function AreByteArraysEqual(ByVal array1 As Byte(), ByVal array2 As Byte()) As Boolean 
    If array1.Length <> array2.Length Then Return False 
    For i As Integer = 0 To array1.Length - 1 
     If array1(i) <> array2(i) Then Return False 
    Next 
    Return True 
End Function 

Private Shared Sub SomeMethod() 
    Dim t_prvBytes() As Byte = New Byte() {SOME VALUES} 'Previously computed HASH 
    Dim t_dllStream As New IO.FileStream("C:\myfile.txt", IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read) 

    Dim t_reader As New IO.StreamReader(t_dllStream) 

    Dim t_dllHash() As Byte = System.Text.Encoding.Unicode.GetBytes(ComputeHashValue(t_reader.ReadToEnd)) 

    MsgBox(AreByteArraysEqual(t_dllHash, t_prvBytes)) 

    t_dllStream.Close() 
End Function 

Antwort

7

Sie sollten nicht den Hash in Text über werden zu konvertieren. Es ist nicht ASCII-Text. (Es ist überhaupt kein Text.) Sie hashen auch das Ergebnis der ASCII-Codierung des Originaltexts, den Sie mit Encoding.Unicode eingelesen haben. Warum?

Sie machen alle Arten von Konvertierungen zwischen Text und Binärformen - und Sie sollten wahrscheinlich nicht tun beliebig. Hash einfach die Binärdaten (mit HashAlgorithm.ComputeHash(Stream)), und behalten Sie das Ergebnis in binär. Wenn Sie wirklich benötigen, um die binären Daten in Text zu konvertieren, verwenden Sie Convert.ToBase64String.

Außerdem vergleichen Sie die Daten mit einem zuvor berechneten Wert - Sie haben jedoch nicht erläutert, woher der zuvor berechnete Wert stammt.

Verwandte Themen