2011-12-20 2 views
3

У меня есть следующий код, который читает поток, чтобы сохранить его содержимое в виде строки. К сожалению, после того, как StreamReader больше не используется, хэш-значение Stream изменилось. Как это возможно? Поток является readonly и, следовательно, не может быть изменен.Чтение потока меняет хэш-значение его

string content; 
string hash = Cryptography.CalculateSHA1Hash(stream); // 5B006E35CF1838871FDC1E3DF52B0CB5A8A97274 
using (StreamReader reader = new StreamReader(stream)) 
{ 
    content = reader.ReadToEnd(); 
} 
hash = Cryptography.CalculateSHA1Hash(stream); // DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 
+0

Пожалуйста, не добавляйте «- C#» к своим названиям. Это то, что мы используем теги для [so]. –

ответ

3

Значение SHA1 DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 является результатом хэширования пустой строки. Вызов Cryptography.CalculateSHA1Hash читает все (от текущей позиции до конца) из строки и хеширует его. Больше нет данных для чтения после первого вызова Cryptography.CalculateSHA1Hash.

Я также предположил бы, что ваш StreamReader.ReadToEnd() возвращает пустую строку по той же причине.

+0

ReadToEnd не возвращает пустую строку. Но с помощью вашего намека и того факта, что поток закрыт после использования (что я должен был знать), теперь ясно, что вычисление хэша замкнутого потока возвращает другое. :) – niklr

2

Являются ли значения 2 одинаковыми? Возможно, ваш метод создает хэш из содержимого потока, а во втором случае поток находится в конечной позиции, поэтому больше нет данных для чтения.

Если вы ищете поток назад к началу, вы получаете согласованные номера?

1

Вы разместили StreamReader в блоке using - это хорошо. Однако TextReader.Dispose по умолчанию вызывает Dispose на базовом потоке. Это может изменить ситуацию.

Попробуйте проверить хэш изнутри блока using.

2

Возможно, поток Position изменился (например, на ReadToEnd), а дайджест рассчитан с текущего Position?

Это только догадка, так как мы не можем вам помочь много, не видя код для Cryptography.CalculateSHA1Hash.

Смежные вопросы