¿Por qué en esta solución que encontré no hay bucle para usar el búfer varias veces?

using System.IO;
using System.Security.Cryptography;

private static string GetChecksum(string file)
{
    using (FileStream stream = File.OpenRead(file))
    {
        SHA256Managed sha = new SHA256Managed();
        byte[] checksum = sha.ComputeHash(stream);
        return BitConverter.ToString(checksum).Replace("-", String.Empty);
    }
}

Estoy intentando generar la suma de comprobación SHA para el archivo + 2GB. ¿Como debería ser?

0
Tomasz M 13 nov. 2017 a las 17:18

2 respuestas

La mejor respuesta

¿Por qué en esta solución que encontré no hay bucle para usar el búfer varias veces?

Porque ComputeHash se encarga de leer todo el flujo y calcular el valor hash.

0
Roman Starkov 13 nov. 2017 a las 14:30

Está utilizando HashAlgorithm .ComputeHash (Stream) anulación.

El lazo está debajo del capó.

Aquí está el código fuente simplificado del método ComputeHash:

public byte[] ComputeHash(Stream inputStream) 
{
    ...
    // Default the buffer size to 4K.
    byte[] buffer = new byte[4096]; 
    int bytesRead;
    do { 
        bytesRead = inputStream.Read(buffer, 0, 4096); 
        if (bytesRead > 0) {
            HashCore(buffer, 0, bytesRead);  // Actual hashing
        }
    } while (bytesRead > 0);
    ...
}

Como puede ver, ComputeHash en realidad está haciendo hash por fragmentos de 4096 bytes .

0
bot_insane 13 nov. 2017 a las 14:30