Вычисление HASH файла возвращает разные значения.
Вопрос
Кто-нибудь знает, почему следующий код возвращает разные результаты на некоторых машинах?
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
Решение
Вам не следует конвертировать хеш в текст с помощью Encoding.ASCII
.Его нет ASCII-текст.(Это вообще не текст.) Вы также хэшируете результат кодирования ASCII исходного текста, который вы читаете, используя Encoding.Unicode
.Почему?
Вы выполняете всевозможные преобразования между текстовыми и двоичными формами, и вам, вероятно, не следует этого делать. любой.Просто хешируйте двоичные данные (используя HashAlgorithm.ComputeHash(Stream)
), а также сохранить результат в двоичном формате.Если вы Действительно нужно преобразовать двоичные данные в текст, используйте Convert.ToBase64String
.
Кроме того, вы сравниваете данные с ранее вычисленным значением, но не объяснили, откуда взялось это ранее вычисленное значение.