Вычислительный файл HASH возвращает разные значения - PullRequest
0 голосов
/ 04 апреля 2009

Кто-нибудь знает, почему следующий код возвращает разные результаты на некоторых машинах?

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

1 Ответ

7 голосов
/ 04 апреля 2009

Вы не должны конвертировать хеш в текст через Encoding.ASCII. Это не текст ASCII. (Это вовсе не текст.) Вы также хэшируете результат ASCII-кодирования исходного текста, который вы читаете, используя Encoding.Unicode. Почему?

Вы делаете все виды преобразований между текстом и двоичными формами - и вам, вероятно, не следует делать любой . Просто хешируйте двоичные данные (используя HashAlgorithm.ComputeHash(Stream)) и сохраняйте результат также в двоичном виде. Если вам действительно необходимо преобразовать двоичные данные в текст, используйте Convert.ToBase64String.

Кроме того, вы сравниваете данные с ранее вычисленным значением - но вы не объяснили, откуда появилось ранее вычисленное значение.

...