Эффективный хэш Silverlight для большого файла - PullRequest
2 голосов
/ 06 апреля 2011

В моем приложении silverlight мне нужно сгенерировать хеш для большого файла (> 2 Гб). Операция занимает много времени.Мой код выглядит так:

    public static string GetFileHash(FileInfo file)
    {            
        FileStream fs = file.OpenRead();
        SHA256 shaM = new SHA256Managed();
        var result = BitConverter.ToString(shaM.ComputeHash(fs));
        return result;
    }

Я думаю, что проблема в том, что я не использую буферизованный поток.В Silverlight я не нашел BufferedStream.

Знаете ли вы эффективную реализацию алгоритма хеширования?Я пробовал md5 ... но он не поддерживается в silverlight.

Большое спасибо, Radu D

Ответы [ 2 ]

3 голосов
/ 06 апреля 2011

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

Вы пытались запустить какие-либо другие хэши в том же файле (например, с помощью инструмента md5sum), чтобы проверить, быстрее ли это? Я был бы удивлен, если бы он был радикально быстрее.

0 голосов
/ 06 апреля 2011

Для хеширования файла код должен прочитать весь файл, что займет некоторое время.Современный жесткий диск может работать со скоростью около 100 МБ / с (это возможно быстрее, но гораздо дороже), поэтому файл размером 2 ГБ займет не менее 20 секунд.

SHA-256не самая быстрая из хэш-функций и управляемого кода в Silverlight - не самая быстрая технология реализации.На самом деле вы можете ожидать что-то вроде 60 МБ / с с 2,4 ГГц ПК Core2 (это то, что я получаю с автономной виртуальной машиной из .NET 4.0 на моем ПК; я могу сделать это немного быстрее - скажем, 75 МБ /s - с моей собственной управляемой реализацией SHA-256).Это неплохо, но все же немного меньше скорости жесткого диска.

Если вы работаете в 64-битном режиме, вы можете попробовать SHA-512, который работает быстрее, чем SHA-256 на64-битные архитектуры (но значительно медленнее в 32-битных системах).Кроме того, вы можете попробовать использовать некоторый нативный код.Существуют и другие хэш-функции, но некоторые из них криптографически повреждены (например, MD5), поэтому, в зависимости от вашей ситуации, вы можете или не захотите их использовать.SHA-1 быстрее, чем SHA-256, поддерживается Silverlight и криптографически «ослаблен» (еще не полностью сломан, но не так надежен, как следовало бы), поэтому он не рекомендуется для новых приложений, если он используется для чего-либочто связано с безопасностью.В любом случае, вы скоро достигнете предела пропускной способности жесткого диска, независимо от того, какую хеш-функцию вы используете.

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