MemoryStream을 사용할 때이 두 파일이 같은 값으로 해시되는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1715362

  •  19-09-2019
  •  | 
  •  

문제

JPG 파일에서 해시를 생성하는 AC# Routine을 작성하고 있습니다. 바이트 배열을 SHA512 객체로 전달하면 예상되는 동작이 발생하지만 메모리 스트림을 전달하면 두 파일은 항상 동일한 값으로 해시됩니다.

Example 1:

        SHA512 mySHA512 = SHA512.Create();

        Image img1 = Image.FromFile(@"d:\img1.jpg");
        Image img2 = Image.FromFile(@"d:\img2.jpg");
        MemoryStream ms1 = new MemoryStream();
        MemoryStream ms2 = new MemoryStream();

        img1.Save(ms1, ImageFormat.Jpeg);
        byte[] buf1 = ms1.GetBuffer();
        byte[] hash1 = mySHA512.ComputeHash(buf1);

        img2.Save(ms2, ImageFormat.Jpeg);
        byte[] buf2 = ms2.GetBuffer();
        byte[] hash2 = mySHA512.ComputeHash(buf2);

        if (Convert.ToBase64String(hash1) == Convert.ToBase64String(hash2))
            MessageBox.Show("Hashed the same");
        else
            MessageBox.Show("Different hashes");

"다른 해시"를 생성합니다. 그러나 ComputeHash 메소드의 과부하 중 하나는 스트림 객체를 가져 와서 오히려 사용합니다. 내가 할 때 :

        SHA512 mySHA512 = SHA512.Create();

        Image img1 = Image.FromFile(@"d:\img1.jpg");
        Image img2 = Image.FromFile(@"d:\img2.jpg");
        MemoryStream ms1 = new MemoryStream();
        MemoryStream ms2 = new MemoryStream();

        img1.Save(ms1, ImageFormat.Jpeg);
        byte[] hash1 = mySHA512.ComputeHash(ms1);

        img2.Save(ms2, ImageFormat.Jpeg);
        byte[] hash2 = mySHA512.ComputeHash(ms2);

        if (Convert.ToBase64String(hash1) == Convert.ToBase64String(hash2))
            MessageBox.Show("Hashed the same");
        else
            MessageBox.Show("Different hashes");

"동일하게 해시"를 생성합니다.

내가 놓친 일이 여기서 무슨 일이 일어나고 있습니까?

도움이 되었습니까?

해결책

메모리 스트림을 되 감이 있지 않으므로 해시는 빈 바이트 시퀀스에서 계산됩니다. 사용

ms1.Position = 0;
ms2.Position = 0;

전화 후 Save.

한 가지 참고 사항 : 사용하지 마십시오 GetBuffer 이런 식으로. 사용 ToArray 스트림 길이와 같은 크기의 바이트 어레이를 제공합니다. GetBuffer 우연히 사용하고 싶지 않은 패딩이있는 (보통)가있는 원시 버퍼를 반환합니다. 당신이 사용할 수있는 GetBuffer 그런 다음 관련 부분 만 사용하는지 확인하십시오. 물론 새 데이터 사본을 작성하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top