Какой из них использовать: Управляемые алгоритмы хеширования без управления
В регулярном приложении С#, какой класс использовать для хэширования: 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.