Какой из них использовать: Управляемые алгоритмы хеширования без управления

В регулярном приложении С#, какой класс использовать для хэширования: xxxManaged или xxx (i.e SHA1Managed vs SHA1) и почему?

Ответы

Ответ 1

Не управляемые хэши, которые заканчиваются на ***Cng, т.е. SHA256Cng, также будут иметь ограничения на платформу. Они немного быстрее, чем управляемые альтернативы, но, например, будут работать во время выполнения в Windows XP. Если вы знаете, что ваша программа всегда будет запускаться в Windows 7, Vista SP1 или 2008, однако, они, как правило, будут работать немного лучше, чем управляемые версии, даже с накладными накладными ресурсами.

Если вы пишете программу общего назначения, с ***Managed будут легче работать, так как они всегда будут работать.

Ответ 2

Вы должны использовать варианты *Managed; они обычно быстрее.

Классы *CryptoProvider и *CNG используют собственный интерфейс и обычно медленнее.
Однако я слышал, что они могут использовать аппаратные криптоаккуляторы. (Я этого не проверял)

Кроме того, родные версии сертифицированы FIPS; управляемые версии не являются.

Ответ 3

Управляемые версии написаны с использованием полностью управляемого кода, версии * Provider - это оболочка вокруг API. Поэтому, если вы всегда используете управляемые версии, ваш код будет переносимым, например. на Mono, но если вы используете версию поставщика, вы будете ограничены платформами Windows.

Ответ 4

Управляемая библиотека более безопасна в использовании и не несет накладных расходов PInvoke. Также для долговременных приложений (ASP.NET), где утечка памяти может накапливаться, чтобы сбить сервер, управление также является предпочтительным.

Ответ 5

Управляемые классы обычно "более безопасны" для использования в .NET; они реализуют интерфейсы, определенные платформой, такие как IDisposable и ICryptoServiceProvider. Тем не менее, они немного медленнее из-за управляемого компонента. Вы должны использовать управляемый класс, если вам нужно создавать и уничтожать эти помощники по своему усмотрению и/или если вам нужно реализовать шаблоны проектирования на основе интерфейса.

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