Все хэш-значения идентичны с использованием Microsoft SHA256.

Используя следующий код, я всегда получаю один и тот же хэш независимо от ввода. Есть идеи, почему это может быть?

    private static SHA256 sha256;
    internal static byte[] HashForCDCR(this string value)
    {
        byte[] hash;
        using (var myStream = new System.IO.MemoryStream())
        {
            using (var sw = new System.IO.StreamWriter(myStream))
            {
                sw.Write(value);
                hash = sha256.ComputeHash(myStream);
            }
        }

        return hash;
    }

person Jacob    schedule 06.08.2013    source источник


Ответы (3)


Вы вычисляете хэш пустой части потока (той, что сразу после содержимого, которое вы написали с помощью sw.Write), поэтому оно всегда одно и то же.

Дешевое решение: sw.Flush();myStream.Position = 0;. Лучшее решение — закончить запись и создать новый поток только для чтения для шифрования на основе исходного потока:

using (var myStream = new System.IO.MemoryStream())
{
    using (var sw = new System.IO.StreamWriter(myStream))
    {
        sw.Write(value);
    }
    using (var readonlyStream = new MemoryStream(myStream.ToArray(), writable:false)
    {
       hash = sha256.ComputeHash(readonlyStream);
    }
}
person Alexei Levenkov    schedule 06.08.2013
comment
Это дает ошибку Не удается получить доступ к закрытому потоку. в строке ComputeHash. Также 3-й оператор using нуждается в другом ) в конце. - person Jacob; 07.08.2013
comment
@OPOSJacob, который должен был быть новым потоком - образец исправлен. - person Alexei Levenkov; 07.08.2013

Возможно, вам придется очистить поток. Для оптимальной производительности StreamWriter не записывает сразу в поток. Он ожидает заполнения своего внутреннего буфера. Сброс записывающего устройства немедленно сбрасывает содержимое внутреннего буфера, чтобы подчеркнуть поток.

     sw.Write(value);
     sw.Flush();
     myStream.Position = 0;
     hash = sha256.ComputeHash(myStream);
person nhrobin    schedule 06.08.2013
comment
Вам нужно установить myStream.Position = 0, как предлагается ниже. Я отредактировал свой ответ, чтобы отразить это. - person nhrobin; 06.08.2013

Я, пожалуй, воспользуюсь тем решением, которое Алексей Левенков назвал «дешевым решением». Тем не менее, я нашел еще один способ заставить его работать, который я опубликую для будущих читателей:

var encoding = new System.Text.UTF8Encoding();
var bytes = encoding.GetBytes(value);
var hash = sha256.ComputeHash(bytes);
return hash;

Джейкоб

person Jacob    schedule 06.08.2013