在一个正常的C#应用程序中,哪个类用于哈希:使用
xxxManaged
还是xxx
(即SHA1Managed
vs SHA1
),为什么?***Cng
结尾,例如SHA256Cng,也会有平台限制。它们比托管的替代方案要快得多,但在运行时在Windows XP上会失败。然而,如果您知道您的程序将始终在Windows 7、Vista SP1或2008上运行,它们通常会比托管版本表现得更好,即使有本地互操作开销。***Managed
类会更容易操作,因为它们始终可用。Environment.OS
并返回SHA512
应该不难。 - SLaks您应该使用*Managed
版本,它们通常更快。
*CryptoProvider
和*CNG
类使用本机交互,并且通常较慢。
但是,我听说它们可以使用硬件加速器。 (我没有检查过)
此外,本机版本已获得FIPS认证;管理版本未经认证。
*Managed 版本完全使用托管代码编写,而 *Provider 版本是 API 的包装器。因此,如果您始终使用托管版本,则您的代码将可移植到 Mono 等平台,但如果您使用 Provider 版本,则仅限于 Windows 平台。
托管库更安全易用,且不会带来 PInvoke 开销。另外,在运行时间长、内存泄漏可能导致服务器崩溃的应用程序(如 ASP.NET)中,托管库也更可取。
在.NET中,托管类通常更“安全”;它们实现了Framework定义的接口,如IDisposable和ICryptoServiceProvider。但是,由于托管组件,它们会稍微慢一些。如果您需要随意创建和销毁这些辅助程序和/或需要实现基于接口的设计模式,则应使用托管类。
非托管类通常更快(因为它们预编译为机器代码),但可能难以使用。销毁非托管类的实例可能会有问题,有时甚至不可能。如果没有托管包装器可以完成相同的工作(因为您可能最终需要实现自己的包装器来处理非托管类的实例化、互操作和销毁),或者如果使用只是一次性的,则应使用这些类。