سؤال

هل يعرف أي شخص، لماذا إرجاع التعليمات البرمجية التالية نتائج مختلفة على بعض الآلات؟

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.

بالإضافة إلى ذلك، أنت تقارن البيانات ذات قيمة محسوبة مسبقا - لكنك لم تفسر أين جاءت هذه القيمة المحسوبة مسبقا من أجل البدء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top