Obter um arquivo SHA256 Código hash e soma de verificação

Anteriormente, perguntei aPergunta, questão sobre a combinação de SHA1 + MD5, mas depois disso eu entendo o cálculo do SHA1 e do MD5 de um arquivo lagrge não é tão rápido quanto o SHA256. No meu caso, um arquivo de 4,6 GB leva cerca de 10 minutos com a implementação padrão SHA256 com (C # MONO) em um sistema Linux.

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

Então eu liEste tópico e de alguma forma mude meu código de acordo com o que eles disseram:

public static string GetChecksumBuffered(Stream stream)
{
    using (var bufferedStream = new BufferedStream(stream, 1024 * 32))
    {
        var sha = new SHA256Managed();
        byte[] checksum = sha.ComputeHash(bufferedStream);
        return BitConverter.ToString(checksum).Replace("-", String.Empty);
    }
}

Mas não tem tanto carinho e leva cerca de 9 minutos.

Então eu tento testar meu arquivo atravéssha256sum comando no Linux para o mesmo arquivo e leva cerca de 28 segundos e o código acima e o comando Linux fornecem o mesmo resultado!

Alguém me aconselhou a ler sobre as diferenças entre o Hash Code e o Checksum e chego aEste tópico isso explica as diferenças.

Minhas perguntas são:

O que causa tanta diferença entre o código acima e o Linuxsha256sum em tempo ?

O que o código acima faz? (Quero dizer, é o cálculo do código de hash ou o cálculo da soma de verificação? Porque se você pesquisar sobre fornecer um código de hash de um arquivo e a soma de verificação de um arquivo em C #, os dois acessam o código acima.)

Existe algum ataque motivado contrasha256sum mesmo quando o SHA256 é resistente a colisões?

Como posso tornar minha implementação o mais rápido possívelsha256sum em c #?

questionAnswers(2)

yourAnswerToTheQuestion