تعرض ملف الحوسبة 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
.
بالإضافة إلى ذلك، أنت تقارن البيانات ذات قيمة محسوبة مسبقا - لكنك لم تفسر أين جاءت هذه القيمة المحسوبة مسبقا من أجل البدء.
لا تنتمي إلى StackOverflow