Чтение потока меняет его хеш-значение - PullRequest
3 голосов
/ 20 декабря 2011

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

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

Ответы [ 4 ]

3 голосов
/ 20 декабря 2011

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

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

2 голосов
/ 20 декабря 2011

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

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

2 голосов
/ 20 декабря 2011

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

Если вы ищите поток обратнов начале вы получаете последовательные цифры?

1 голос
/ 20 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...