Я пишу подпрограмму С#, которая создает хэши из файлов jpg. Если я передам массив байтов моему объекту SHA512, я получу ожидаемое поведение, однако, если я передам поток памяти, два файла всегда будут иметь одно и то же значение.
Пример 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");
Это дает «Хешированное то же самое».
Что здесь происходит, чего мне не хватает?
mySHA512.ComputeHash.ComputeHash(ms1.GetBuffer(), 0, (int)ms1.Length)
. Избегает ненужных копий - person CodesInChaos   schedule 24.01.2014MemoryStream.GetBytes()
был бы более правильным, чем вызовGetBuffer()
. Первый ограничивает возвращаемые данные фактическим содержимым потока, а второй возвращает полный буфер, включая неиспользованное заполнение в конце. - person Peter Duniho   schedule 30.07.2019